2017-10-07 9 views
0

私はNodeというクラスを2つのコンストラクタを持っています。私が他のコンストラクタからコンストラクタの1つを呼び出して呼び出し側の指すメモリに割り当てようとすると、エラーは発生しません。しかし、ヒープ上に割り当てられたメモリ/オブジェクトをnewに割り当てようとすると、エラーのエラーが発生するが返されます。以下は私のコードです。考えられる理由は何でしょうか?C++でこのオブジェクトにメモリを割り当てる

class Node{ 
    private: 
     int key; 
     Node* left, *right; 
    public: 
     Node(){ 
      left=NULL; 
      right= NULL; 
     } 

     Node(int data){ 
      this=new Node(); // generates error 'expression is not assignable' 
      *this= Node(); //compiles succesfully 
      this->key=data; 
     } 
} 
+2

ところで、あなたの二行目(*これは、ノード(=)を;)、コンパイラが提供するデフォルトの代入演算子(ノード::演算子を使用して、一時的なNodeオブジェクトを作成しています= (const Node&))を使用して一時ノードの状態を最初のNodeオブジェクトの状態にコピーした後、一時Nodeオブジェクトを破棄します。それはうまくいきますが、それを避けてメンバー値を直接初期化する方が良いと思います。 –

+1

@JeremyFriesner * "C++で別のコンストラクタから1つのコンストラクタを呼び出すことはできません" * - C++ 11では可能です。 – cdhowie

+0

@cdhowieあなたはそうです、私はそれを忘れてしまったでしょう:) –

答えて

4

C++ 11がdelegating constructorsことができます:あなたのコードについて

class Node { 
    private: 
     int key; 
     Node* left, right; 

    public: 
     Node() { 
      left = NULL; 
      right = NULL; 
     } 

     Node(int data) : Node() { 
      this->key=data; 
     } 
}; 

他のいくつかのコメント:


Node* left, right; 

これは、ポインタ対Nodeするleftを宣言し、 rightNode(ポインタではありません)、thoug

Node *left, *right; 

または、さらに良い:あなたは変数の左、ないタイプの右にアスタリスクを置く理由

Node* left; 
Node right; 

これは、次のとおりです。

Node *left; 
Node *right; 
あなたがこれを書いていた時間C++ 11では
left = NULL; 

、を使用NULLの代わりにあなたはとにかく初期化子リストを使用する必要があります。

Node() : left(nullptr), right(nullptr) { } 
+0

「Node * left、right」の部分について申し訳ありません。質問を書いている間に1つのアスタリスクを忘れてしまった。新しいことを学びました。ありがとうございました :) – yabhishek