我有一个类应该有一个与其成员类型相同的类。
我的声明如下:
class clsNode
{
private:
clsNode m_Mother;
public:
void setMother(const clsNode &uNode, int index);
};
C ++告诉我“该对象显示的类型限定符与成员函数不兼容。
我不知道哪里出错了。
答案 0 :(得分:3)
原因是成员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
创建对象答案 1 :(得分:0)
您不能在班级中拥有相同类型的成员。编译器尝试计算对象的大小并进行“进入循环”的排序。你可以通过使用间接来解决这个问题。例如,您可以将指针存储到母节点。
class clsNode
{
private:
clsNode* m_Mother;
public:
void setMother(const clsNode &uNode, int index);
};
答案 2 :(得分:0)
如果您拥有类类型的成员(直接不是指针),则您的母类实例实际包含所包含的实例。
在这种情况下,编译器找不到clsNode类的大小,因为有一个循环。它应该包含一个clsNode,它应该包含一个clsNode,依此类推。