2016-09-14 11 views
0

Rvalueをコピーコンストラクタまたは代入演算子に渡すことは、私にとっては非常に重要なことです。例えば:このなしRvaluesをコピーコンストラクタと代入演算子に渡します

int a = b+c; 

または

int a; 
a = b+c; 

は数学の計算を行うのは難しいだろう。
私はクラスでこれを行うことができません。ここに私のコードです

#include <iostream> 

using namespace std; 

struct node{ 
public: 
    node(int n){ 
     node* ptr = this; 
     data = 0; 

     for (int t=0; t<n-1; t++){ 
      ptr -> next = new node(1); 
      ptr = ptr -> next; 
      ptr -> data = 0; 
     } 

     ptr -> next = NULL; 
    } 
    node(node &obj){ 
     node* ptr = this; 
     node* optr = &obj; 
     while (true){ 
      ptr -> data = optr -> data; 
      optr = optr -> next; 
      if (optr == NULL) break; 
      ptr -> next = new node(1); 
      ptr = ptr -> next; 
     } 
    } 
    void operator=(node &obj){ 
     delete next; 
     node* ptr = this; 
     node* optr = &obj; 
     while (true){ 
      ptr -> data = optr -> data; 
      optr = optr -> next; 
      if (optr == NULL) break; 
      ptr -> next = new node(1); 
      ptr = ptr -> next; 
     } 
    } 
    ~node(){ 
     if (next != NULL) delete next; 
    } 


private: 
    double data; 
    node* next; 
}; 

node func1(){ 
    node a(1); 
    return a; 
} 

void func2(node a){ 
    node b(1); 
    b = func1(); 
} 



int main(){ 
    node v(3); 
    func1(); 
    func2(v); 
} 

私はこのコンパイルエラー与えています:

expects an l-value for 1st argument 

は、どのように私はR値と同様にL値をとるコピーコンストラクタと代入演算子を書くことができますか?

ありがとうございました

+1

移動コンストラクタと代入演算子で何が問題になりますか? – tkausl

+0

"l値だけでなくr値も取るコピーコンストラクタと代入演算子はどのように書くことができますか?"あなたはそうしない。あなたはちょうどそれぞれを実装します。 'node(const node&obj)'と 'node(node && obj)' - assgnと同じです。コピーコンストラクタの 'const'に注意してください。 '&& obj'をコンテンツを移動させた後で破壊可能な状態にすることを忘れないでください。 –

答えて

0

あなたは移動を達成するためにコピーアンドアサイン演算子を誤って使用しています。従来は、コピー元と代入演算子はconstの参照を受け取り、r値とl値の両方にバインドすることができます。コピーと移動のセマンティクスをConflating

node(node&& n){ /* pilfer 'n' all you want */ } 
node& operator=(node&& n) { /* ditto */ } 

だけ後で災いの原因:あなたが移動を実現したい場合は、その後、移動c'torと代入演算子を使用します。

+0

修正 'node(node && n){/ * pilfer 'n'あなたが望むものはすべて、**それをコヒーレントな状態にする** * /}' –