我有3个类,一个Base类,一个Parent类和一个Child类。父有m_children
向量,其中可以包含多个子元素,但子元素只能有一个父对象,因为它是m_parent
属性。我该如何实现呢?这里是类的快速预览(为了问题而重写)
Base.h
class Base
{
public:
Base();
virtual void getClid();
virtual void setClid();
private:
int m_clid;
};
Parent.h
#include <vector>
#include "Base.h"
#include "Child.h"
class Parent : public Base
{
public:
Parent();
void addChild(Child* child);
void removeChild(Child* child);
Child* getChild(int index);
private:
std::vector<Child*> m_children;
};
Child.h
#include "Base.h"
class Child : public Base
{
public:
Child();
Base* getParent();
void setParent(Base* parent);
private:
Base* m_parent;
};
现在问题就在于,我只能在“Child.h”中包含“Parent.h”,反之亦然,而不是两者。我如何告诉Child他父母的类型?下面的代码工作正常,但是如果我想从Child对象的析构函数中调用m_parent->removeChild(this);
,它将无法工作因为Child只知道Parent的getClid和setClid方法,它们都在“Base.h”中定义< / p>
答案 0 :(得分:0)
如果我理解你的问题,你可以为Child.h做类似的事情:
#include "Base.h"
class ParentObject;
class Child : public Base
{
public:
Child();
ParentObject* getParent();
void setParent(ParentObject* parent);
private:
ParentObject* m_parent;
};
答案 1 :(得分:0)
您可以在Parent标头中转发声明child
,反之亦然,从而打破循环依赖。
#include <vector>
#include "Base.h"
class Child;
class Parent : public Base
{
public:
Parent();
void addChild(Child* child);
void removeChild(Child* child);
Child* getChild(int index);
private:
std::vector<Child*> m_children;
};
和
#include "Base.h"
class Parent;
class Child : public Base
{
public:
Child();
Parent* getParent();
void setParent(Parent* parent);
private:
Parent* m_parent;
};
但我要说,这里有太多的原始指针和太多的setter和非接口。我闻到了一个狡猾的设计。