0

我有 3 个类,一个基类,一个父类和一个子类。Parent 有m_children一个可以有多个孩子的向量,但是一个孩子只能有一个父对象作为它的m_parent属性。我应该如何实现这个?这是课程的快速预览(为了问题而重写)

基数.h

class Base
{
public:
    Base();
    virtual void getClid();
    virtual void setClid();
private:
    int m_clid;
};

父.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;
};

孩子.h

#include "Base.h"

class Child : public Base
{
public:
    Child();
    Base* getParent();
    void setParent(Base* parent);
private:
    Base* m_parent;
};

如您所见,现在这里的问题是我只能在“Child.h”中包含“Parent.h”,或者反过来,不能同时包含两者。我如何告诉孩子他父母的类型?下面的代码可以正常工作,但是如果我想m_parent->removeChild(this);从 Child 对象的析构函数中调用例如,它将不起作用,因为 Child 只知道 Parent 的 getClid 和 setClid 方法,它们都在“Base.h”中定义

4

2 回答 2

0

如果我理解你的问题,你可以为 Child.h 做类似的事情:

#include "Base.h"

class ParentObject;

class Child : public Base
{
public:
    Child();
    ParentObject* getParent();
    void setParent(ParentObject* parent);
private:
    ParentObject* m_parent;
};
于 2012-11-20T13:56:44.180 回答
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;
};

但我得说,这里有太多的原始指针、太多的设置器和非接口。我闻到了一个狡猾的设计。

于 2012-11-20T13:59:51.570 回答