шаблоны проектирования — зависимость циклического наследования C ++

Каждое из следующих утверждений включает в себя охранники вокруг них для соответствующих им заголовочных файлов.

C расширяет B, вещи подкласса B, чтобы они могли получить указатель на A — но A имеет несколько полей, которые являются подклассами B.

Мое текущее решение состоит в том, чтобы хранить B в массиве void и использовать шаблонные методы, которые возвращают правильный объект на основе информации о типе во время выполнения. Но я хочу знать, есть ли способ для A иметь поля C, даже если C нужно соединиться с A, Ahead Of Time (время компиляции).

Я прошел несколько курсов по объектно-ориентированному программированию (они были в основном на Java), но ни один из них не был посвящен конкретно C ++.

Вероятно, это распространенная проблема, и этот вопрос, вероятно, уже задавался и здесь был дан ответ, но я не знаю, какие ключевые слова использовать, чтобы найти такое решение.

хиджры

//#include "C.h" //would cause cyclical include
class A {
public:
A();
virtual ~A();

/**Type must be checked at runtime, because otherwise cyclical includes occur*/
template <class T> T* getComponent();
private:
//C* aComponent; //desired implementation
//Current implementation
void* components;
unsigned char componentCount;

};

B.h

#include "A.h"class B {
public:
B();
virtual ~B();
A* getRoot();

private:
A* aRoot;
};

C.h

#include "B.h"class C : B {
public:
B();
virtual ~B();
};

Другие языки ООП, которые я использовал, просто решают такие проблемы за кулисами, тогда как C ++ требует, чтобы порядок сборки был правильным. Я видел несколько ответов на другие вопросы, которые были похожи на этот вопрос, но они были немного неясны, пожалуйста, будьте лаконичны в своем ответе.

0

Решение

Просто используйте предварительные объявления:

class C;

Положив это в верхней части A.h позволит вам использовать класс в качестве типа, вместо использования указателей void.

РЕДАКТИРОВАТЬ: Чтобы уточнить, это просто сигнализирует компилятору, что есть некоторый класс с именем C, но нет определения для этого. Вы сможете объявить указатели на него, но вы не сможете использовать ни одного из его членов, пока компилятор не увидит фактическое определение за это (что не должно быть проблемой).

1

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

Других решений пока нет …