C ++ устанавливает атрибут производного класса для неизвестного объекта класса, производного от того же базового класса?

У меня есть 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»

0

Решение

Если я хорошо понимаю ваш вопрос, вы можете сделать что-то подобное для Child.h:

#include "Base.h"
class ParentObject;

class Child : public Base
{
public:
Child();
ParentObject* getParent();
void setParent(ParentObject* parent);
private:
ParentObject* m_parent;
};
0

Другие решения

Вы можете отправить-объявить 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;
};

Но я должен сказать, что здесь слишком много необработанных указателей и слишком много сеттеров и неинтерфейсов. Я чувствую неловкий дизайн.

0

По вопросам рекламы [email protected]