2017-10-07 2 views
0

J'ai une classe appelée Node qui a deux constructeurs. Lorsque j'essaie d'appeler l'un des constructeurs de l'autre et de l'assigner à la mémoire pointée par celui-ci de l'appelant, je n'obtiens aucune erreur. Mais quand j'essaye d'assigner mémoire/objet alloué sur le tas en utilisant new à this j'obtiens une erreur l'expression n'est pas assignable. Voici mon code. Quelles pourraient être les raisons possibles?Allocation de mémoire à cet objet en 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 votre deuxième ligne (* this = node();) crée un objet de nœud temporaire, puis en utilisant l'opérateur d'affectation par défaut fourni par le compilateur (Noeud opérateur :: = (const Node &)) pour copier l'état du Node temporaire sur l'état du premier objet Node, puis détruire l'objet Node temporaire. Cela fonctionne, mais je pense que vous feriez mieux d'éviter cela et de simplement initialiser directement les valeurs des membres. –

+1

@JeremyFriesner * "vous ne pouvez pas appeler un constructeur d'un autre constructeur en C++" * - Vous pouvez en C++ 11. – cdhowie

+0

@cdhowie vous avez raison, j'avais oublié que :) –

Répondre

4

11 C++ permet delegating constructors:

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

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

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

Quelques autres commentaires au sujet de votre code:


Node* left, right; 

Ceci déclare left être pointeur-to-Node et right pour être Node (pas un pointeur), comme h vous avez écrit ceci:

Node* left; 
Node right; 

C'est pourquoi vous placez l'astérisque à gauche de la variable, et non pas le droit du type:

Node *left, *right; 

Ou, mieux encore:

Node *left; 
Node *right; 

left = NULL; 

en C++ 11, utiliser nullptr au lieu de NULL. Vous devez utiliser une liste de initialiseur de toute façon:

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

Désolé pour la partie 'Node * left, right'. oublié un astérisque tout en écrivant la question. J'ai appris quelque chose de nouveau. Je vous remercie :) – yabhishek