メンバーと同じタイプのクラスを持つべきクラスがあります。
私の宣言は次のとおりです。
class clsNode
{
private:
clsNode m_Mother;
public:
void setMother(const clsNode &uNode, int index);
};
C++ は、「オブジェクトは、メンバー関数と互換性のない型修飾子を示しています。
どこで間違えたのかわからない。
その理由は、メンバー m_Mother の型が、宣言された時点で不完全型であるためです。
考えてみれば。それが機能する場合は、同じタイプのオブジェクトを内部に持つオブジェクトを作成し、そのオブジェクトは常に内部に同じタイプのオブジェクトを持ちます (など)。オブジェクトは、ある意味で無限のサイズになります。
1 つの解決策は、代わりに親クラスへのポインタを保持することです。
class clsNode
{
private:
clsNode* m_Mother;
public:
void setMother(clsNode* uNode){ m_Mother=uNode; }
};
子の存続期間中、すべての親を常に存続させたい場合は、生のポインターの代わりに共有ポインターを使用できます。
class clsNode
{
private:
std::shared_ptr<clsNode> m_Mother;
public:
void setMother(std::shared_ptr<clsNode> uNode){ m_Mother=uNode; }
};
このソリューションを使用する場合、最初は make_shared でオブジェクトを作成します
クラス内に同じ型のメンバーを持つことはできません。コンパイラは、オブジェクトのサイズを計算しようとし、一種の「ループに入ります」。インダイレクションを使用することで、これを回避できます。たとえば、ポインタをマザー ノードに格納できます。
class clsNode
{
private:
clsNode* m_Mother;
public:
void setMother(const clsNode &uNode, int index);
};
クラス型のメンバー (直接はポインターではない) がある場合、親クラスのインスタンスには、含まれるインスタンスが物理的に含まれます。
この場合、循環があるため、コンパイラは clsNode クラスのサイズを見つけることができません。clsNode を含む必要があり、clsNode を含む必要があります。