2017-10-07 8 views
0

두 개의 생성자가있는 Node이라는 클래스가 있습니다. 내가 생성자 중 하나를 다른 호출자로부터 호출하려고하고 호출자가 가리키는 메모리에 할당하려고하면 오류가 발생하지 않습니다. 그러나 메모리를 할당하려고 할 때 new을 사용하여 힙에 할당 된 객체를 this에 입력하면이라는 표현식을 사용할 수 없으므로 표현식에 오류가 발생합니다. 다음은 내 코드입니다. 가능한 이유는 무엇일까요?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

Btw는 두 번째 라인 (*이 노드 (=)를) 다음 컴파일러에서 제공하는 기본 할당 연산자 (노드 :: 연산자를 사용하여, 임시 노드 객체를 생성한다 = (const Node &))를 사용하여 임시 노드의 상태를 첫 번째 노드 객체의 상태로 복사 한 다음 임시 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; 

이 포인터 - 투 - Nodeleft을 선언하고 rightNode (포인터가 아님)으로, thoug 시간 당신이 쓴이 :

Node* left; 
Node right; 

당신이 변수의 왼쪽, 유형이 아닌 오른쪽에 별표 (*)를 배치하는 이유는 다음과 같습니다 더 나은

Node *left, *right; 

또는 :

Node *left; 
Node *right; 
C++ 11에서
left = NULL; 

,,746를 사용 NULL 대신당신은 어쨌든 초기화 목록을 사용한다 :

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

'Node * left, right' 부분은 죄송합니다. 질문을 쓰는 동안 하나의 별표를 잊어 버렸습니다. 새로운 것을 배웠습니다. 고맙습니다 :) – yabhishek