2012-05-31 2 views
-1

скажем я хочу собрать что-то вроде этого:с ++ Рекурсивные заголовки для абстрактных классов

//Prova.h: 
//-------------------- 
#ifndef _PROVA_ 
#define _PROVA_ 

#include "Terza.h" 

class Prova{ 
public: 
Prova(); 

}; 
#endif 

и

//Terza.h: 
//-------------------- 
#ifndef _TERZA_ 
#define _TERZA_ 

#include "EreProva.h" 

class Terza{ 
public: 
    Terza(); 
}; 
#endif 

и

//EreProva.h: 
//-------------------- 
#ifndef _EREPROVA_ 
#define _EREPROVA_ 

#include "Prova.h" 

class EreProva : public Prova{ 
    public: 
    EreProva(); 
}; 
#endif 

которым не компилируется говоря «» Prova ': базовый класс undefined ".

Каков наилучший способ избежать рекурсий заголовка между унаследованными классами

+0

Что это такое? Вы должны принять ответ Aiok Save. –

ответ

0

Иногда вы можете обойти проблемы такого рода по Трингу следующего: (1) попробуйте добавить «#pragma раз» директиву сверху ваших файлов, хотя это может быть специфичным для компилятора (я использовал его при разработке в VC++ некоторое время назад) (2) вместо включения файлов заголовков в классе, вы можете попробовать просто добавить «класс Prova» или любой класс, который он , чтобы указать класс, который вы позже определите, но хотите «использовать» сейчас.

Хотя, как говорит Алс, лучше избегать таких конструкций.

4

Если вам нужно иметь циклические зависимости, что-то не так с вашим дизайном, и вы должны пересмотреть свой дизайн и попытаться удалить такие сложные и нежелательные циклические зависимости.

Одним из преодоления циклических зависимостей является использование Forward Declarations, но учтите, что если вы вперед объявить тип тип становится Неполная тип для компилятора и существуют ограничения относительно того, что операции, которые вы можете делать с ним. Вы не можете выполнять какие-либо операции над экземплярами этого типа, которым нужен компилятор, чтобы узнать макет памяти этого типа.

Хорошо читать:
When can I use a forward declaration?

+0

+1 для обозначения сломанного дизайна. ** Это важный бит **, а не какой-то синтаксический трюк, чтобы обойти его. –

+0

Предположим, что Терза - это карта. Прова - это то, что хочет двигаться по этой карте. EreProva - это основной квадрат этой карты. Чтобы переместить Прову, мне нужно знать карту. Чтобы нарисовать карту, мне нужно использовать квадраты. –

+0

На самом деле, теперь, когда я смотрю на это более внимательно ... –

0

В этом коде:

//Prova.h: 
//-------------------- 
#ifndef _PROVA_ 
#define _PROVA_ 

#include "Terza.h" 

class Prova{ 
public: 
Prova(); 

}; 

Поскольку вы не используете Tezra класс в любом случае, вам не нужно #include. Вытащите его. Кроме того, вы отсутствуете и #endif. Закройте файл #ifndef в этом файле с подходящим #endifв этом файле.

Кроме того:

//Terza.h: 
//-------------------- 
#ifndef _TERZA_ 
#define _TERZA_ 

#include "EreProva.h" 

class Terza{ 
public: 
    Terza(); 
}; 
#endif 

#endif 

Вы также не использовать EreProva класс в этом файле вообще - так достаньте #include заявление. У вас также есть дополнительные #endif в конце файла. Здесь всего один #ifndef, поэтому должен быть только один #endif. Возьмите последнего.

+0

Я знаю, что я не пользуюсь включенными, это был всего лишь пример –

+0

Пожалуйста, разместите фактический код, который демонстрирует настоящую проблему, иметь. Тогда мы можем дать вам лучший совет. –

+0

Спасибо за ответы. Моя проблема заключается в том, как скомпилировать эту вещь. Мне нужно использовать все заголовки. Например, создавая экземпляр переменной EreProva в Terza и переменной Terza в Prova. Я хотел бы знать, есть ли какой-то метод, кроме переосмысления зависимостей классов –

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