C ++将派生类的属性设置为从同一基类派生的未知类对象?

Posted

技术标签:

【中文标题】C ++将派生类的属性设置为从同一基类派生的未知类对象?【英文标题】:C++ setting attribute of a derived class to an unknown class object, derived from same base class? 【发布时间】:2012-11-20 13:48:30 【问题描述】:

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

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

【问题讨论】:

C++ creating doubly-linked classes的可能重复 【参考方案1】:

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

#include "Base.h"

class ParentObject;

class Child : public Base

public:
    Child();
    ParentObject* getParent();
    void setParent(ParentObject* parent);
private:
    ParentObject* m_parent;
;

【讨论】:

使用前向声明时,我只收到两个错误:invalid use of incomplete type 'struct Parent'forward declaration of 'struct Inventory' 来自m_parent-&gt;removeItem(this); 不要实现头部的功能。在单独的源文件中实现它们并在其中包含父标题。 您是否在 Child.c 中包含 Parent.h ?【参考方案2】:

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

【讨论】:

嗯,介意提供更多信息吗?想不出更好的方法。

以上是关于C ++将派生类的属性设置为从同一基类派生的未知类对象?的主要内容,如果未能解决你的问题,请参考以下文章

如果该属性在派生类中被覆盖,如何调用基类的属性?

5继承与派生6-虚基类

拥有所有从同一个基类派生的类实例集合的最佳方法是啥?

C++ 为啥我可以从派生类调用基类的私有虚函数?

c#核心基础--类的继承

虚函数和基类中的this指针的问题!