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->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->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 ++将派生类的属性设置为从同一基类派生的未知类对象?的主要内容,如果未能解决你的问题,请参考以下文章