C++中类作为类成员的使用方法

3

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

我的声明如下:

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

C++告诉我:“对象显示了与成员函数不兼容的类型限定符。”

我不知道我哪里出错了。

3个回答

4

原因是在声明成员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; }
};

如果您选择此解决方案,则最初需要使用make_shared创建对象。


我认为你想要的可能是一个 weak_ptr <clsNode>。 命名表明母节点拥有子节点,您不希望通过具有指针循环来防止解除分配。 - Roman Kutlak
当然可以。但是我猜想这个孩子的母亲可能并不拥有他,因为你可以没有母亲。 - Johan Lundberg

0

在类内部不能有相同类型的成员。编译器试图计算对象的大小,然后陷入了一种“循环”状态。您可以通过使用间接引用来解决这个问题。例如,您可以存储指向母节点的指针。

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

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接