2016-11-30 9 views
1

私はC++プログラミングの新人です。ここに私のコードは次のとおりです。C++エラー:フィールドに不完全な型があります - 独自のクラスオブジェクトを宣言します

#ifndef NODE_H 
#define NODE_H  

class Node 
{ 
    public: 
     Node(); 
     Node(int); 
     virtual ~Node(); 
     Node(const Node& other); 

     int getValue() { return value; } 
     void setValue(int val) { value = val; } 
     Node getPrev() { return prev; } 
     void setPrev(Node val) { prev = val; } 
     Node getNext() { return next; } 
     void setNext(Node val) { next = val; } 

    private: 
     int value; //!< Member variable "value" 
     Node prev; //!< Member variable "prev" 
     Node next; //!< Member variable "next" 
}; 

#endif // NODE_H 

それは言う:

error field 'prev' has incomplete type 
error field 'next' has incomplete type 

私は、ポインタ/参照を使用する場合は、プログラムが正常に動作します。なぜこのメカニズムが存在するのですか?どのようにポインタ/参照なしでそれを行うには? お返事ありがとうございます。

+0

すべての「ノード」に「int」と2つの「ノード」が含まれている場合、そのサイズは無限になります。それはおそらくあなたが望むものではありません。 – Quentin

+0

* "ポインタ/参照無しでどうやってやるの?" *短いストーリー:できません。 –

+0

別の方法:https://stackoverflow.com/questions/6349822/incomplete-type-in​​-class-which-has-a-member-of-the-same-type-of-the-class-itse –

答えて

3

クラスは、その閉じ括弧まで完全には定義されていません。その前に、クラスのオブジェクトを定義することはできません。主な理由は、オブジェクトのサイズが未知であるため、コンパイラはメンバ変数に割り当てるメモリの量を知らないためです。

クラスへのポインタまたは参照を使用すると、実際のクラスのサイズとは無関係なので、コンパイラはポインタまたは参照がどれくらいのメモリを占めるかを知ることができます。

関連する問題