У меня есть 3 класса, базовый класс, родительский класс и дочерний класс. Родитель имеет 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;
};
Теперь проблема здесь, как вы видите, заключается в том, что я могу включить только «Parent.h» в «Child.h» ИЛИ наоборот, но не оба. Как мне сказать ребенку тип его родителя? Код ниже работает нормально, но если я хочу позвонить m_parent->removeChild(this);
например, из деструктора объекта Child, он не будет работать, потому что Child знает только методы getClid и setClid класса Parent, которые определены в «Base.h»
Если я хорошо понимаю ваш вопрос, вы можете сделать что-то подобное для Child.h:
#include "Base.h"
class ParentObject;
class Child : public Base
{
public:
Child();
ParentObject* getParent();
void setParent(ParentObject* parent);
private:
ParentObject* m_parent;
};
Вы можете отправить-объявить child
в заголовке Parent и наоборот, нарушая круговую зависимость.
#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;
};
Но я должен сказать, что здесь слишком много необработанных указателей и слишком много сеттеров и неинтерфейсов. Я чувствую неловкий дизайн.