C++ C++;与班上的成员同班

C++ C++;与班上的成员同班,c++,class,member,C++,Class,Member,我有一个类,它应该有一个与其成员类型相同的类 我的声明如下: class clsNode { private: clsNode m_Mother; public: void setMother(const clsNode &uNode, int index); }; C++告诉我“对象显示的类型限定符与成员函数不兼容 我不知道哪里出错了。原因是成员m_Mother的类型在声明时的类型不完整 如果你仔细想想,如果它能工作,你会创建一个对象,里面有一个相同类型的对象,而

我有一个类,它应该有一个与其成员类型相同的类

我的声明如下:

class clsNode
{
private:
     clsNode m_Mother;
public:
     void setMother(const clsNode &uNode, int index);
};
C++告诉我“对象显示的类型限定符与成员函数不兼容


我不知道哪里出错了。

原因是成员m_Mother的类型在声明时的类型不完整

如果你仔细想想,如果它能工作,你会创建一个对象,里面有一个相同类型的对象,而这个对象里面总是有一个相同类型的对象(依此类推)。从某种意义上说,这个对象的大小是无限的

一种解决方案是保留指向父类的指针

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; }
};
类clsNode
{
私人:
性病:共享母亲;
公众:
void setMother(std::shared_ptr uNode){m_Mother=uNode;}
};

如果使用此解决方案,您最初将使用make_shared创建对象。类中不能有相同类型的成员。编译器尝试计算对象的大小,排序“进入循环”。“你可以用间接的方法来解决这个问题。例如,可以存储指向母节点的指针

class clsNode
{
private:
     clsNode* m_Mother;
public:
     void setMother(const clsNode &uNode, int index);
};

当您有一个类类型的成员(直接不是指针)时,您的母类的实例在物理上包含所包含的实例


在这种情况下,编译器无法找到clsNode类的大小,因为存在一个循环。它应该包含一个clsNode,它应该包含一个clsNode,等等。

我想你想要的可能是一个
弱\u ptr
。命名表明母节点拥有子节点,您不希望通过指针循环阻止释放。当然,这会起作用。但是我猜母亲不拥有这个孩子,因为你可以没有母亲。