2013-07-12 2 views
0

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

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

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

Я провел несколько курсов по объектно-ориентированному программированию (они были в основном в 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; 

}; 

Bh

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

private: 
    A* aRoot; 
}; 

Ch

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

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

ответ

1

Просто использовать вперед заявление:

class C; 

Полагая, что в верхней части A.h позволит использовать класс в качестве типа, вместо того, чтобы использовать недействительные указатели.

EDIT: Чтобы это прояснить, это просто сигнализирует компилятору, что есть класс, называемый C, но для него нет определения. Вы сможете объявить указатели на него, но вы не сможете использовать ни одного из его членов, пока компилятор не увидит фактическое определение для него (что не должно быть проблемой).

+0

Итак, это похоже на использование extern, но для занятий. – awiebe

+0

Да, точно верно. –

Смежные вопросы