2017-10-07 39 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