派生类的C ++设置属性是否来自同一个基类的未知类对象?

时间:2012-11-20 13:48:31

标签: c++ class inheritance parent base

我有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>

2 个答案:

答案 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和非接口。我闻到了一个狡猾的设计。