0

Base クラス、Parent クラス、Child クラスの 3 つのクラスがあります。親にはm_children複数の子を持つことができるベクトルがありますが、子はその属性として 1 つの親オブジェクトしか持つことができません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;
};

ご覧のとおり、ここでの問題は、"Parent.h" を "Child.h" に含めるか、またはその逆にのみ含めることができ、両方を含めることができないことです。子に親のタイプを伝えるにはどうすればよいですか? 以下のコードは正常に動作しますが、たとえば Child オブジェクトのデストラクタから呼び出したい場合m_parent->removeChild(this);、子は親の 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 に答える