2016-09-12 2 views
-4

У меня есть класс с именем Node. Он содержит две личные данные. Один - это строка, а другой - указатель узла. Теперь у меня есть конструктор этого класса, который будет содержать два параметра. Один - это строка, а другой - указатель узла.Конструктор Calling

class Node 
    { 
     private: 
      string data; 
      Node *P; 
     public: 
      Node(string s, Node* p) 
      { 
       data=s; 
       P=p; 
      } 
      ~Node(); 
    }; 

    int main() 
    { 
     string str=""; 
     Node n(str, Node* P); 
     return 0; 
    } 

В чем проблема с этим кодом? И почему? Я хочу объявить объект с помощью этого конструктора по умолчанию, для которого параметром будет строка и указатель класса узла.

+0

по определению ++, А «конструктор по умолчанию» является конструктором без параметров, сгенерированный компилятором, если вы не предоставите любой конструктор. Это не так. –

+0

Несоответствующий код - неправильный код. – LogicStuff

+0

Я не совсем уверен, что вы пытаетесь сделать. Можете ли вы дать нам еще один контекст? – Mickey

ответ

0
Node n(str, Node* P); 

Во втором аргументе используется синтаксис объявления переменных. Это невозможно.

Вместо этого вы должны объявить P первый:

Node* P = NULL; 
Node n(str,P); 

Но сейчас проблема в том, что ваш конструктор разыменовывает P здесь: p->P=NULL;, так что нам нужно, чтобы убедиться, что на самом деле P указывает на действительный Node. Для этого нам нужно сначала создать Node, но опять же проблема заключается в том, что для создания Node нам нужен действительный Node в качестве аргумента для P. Поэтому, поскольку вы не можете создать Node s вообще.

Я не совсем понимаю ваши намерения, но конструктор должен построить текущий экземпляр класса, а не какой-либо другой объект, переданный указателем. В Node(string s, Node* p) вы хотите заполнить данные data и P с некоторыми значениями. И так как вы проходите string s, я думаю, было бы целесообразно назначить это data, то есть data = s. Точно так же Node* p должен быть указателем на родительский элемент текущего узла, который вы хотите сохранить в P, поэтому почему бы не назначить P = p?

1

Я думаю, проблема в том, что вы неправильно используете идею конструктора по умолчанию. Конструктор по умолчанию не должен принимать никаких параметров. Вот пример:

class Node 
{ 
    private: 
     string data; 
     Node *P; 
    public: 
     Node() 
     { 
      data=""; 
      P=NULL; 
     } 
     ~Node(); 
}; 

int main() 
{ 
    Node n(); 
    return 0; 
} 

И я думаю, что вы должны прочитать больше о C синтаксис