2017-10-07 35 views
0

我有一個叫做Node的類,它有兩個構造函數。當我嘗試從另一個調用其中一個構造函數並將其分配給調用者指向的內存時,我不會收到任何錯誤。但是,當我嘗試使用newthis分配堆上分配的內存/對象時,我收到一個錯誤表達式不可分配。以下是我的代碼。可能的原因是什麼?在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&))將臨時節點的狀態複製到第一個節點對象的狀態,然後銷燬該臨時節點對象。這很有效,但我認爲你會避免這種情況,並直接初始化成員值。 –

+1

@JeremyFriesner *「你不能從C++的另一個構造函數中調用一個構造函數」* - 你可以在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; 

這聲明left是指針TO- NoderightNode(不是指針),因爲你...你這樣寫的:

Node* left; 
Node right; 

這就是爲什麼你把星號的變量的左側,類型不正確的:

Node *left, *right; 

,或者甚至更好:

Node *left; 
Node *right; 

left = NULL; 

在C++ 11,使用nullptr而不是NULL。你應該無論如何使用初始化列表:

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

對不起'Node * left,right'部分。在寫問題時忘了一個星號。學到了新東西。謝謝 :) – yabhishek