2010-08-04 2 views
3

У меня есть шаблон включения следующим образом: «„Class1_namespace“не называет тип»Включение проблемы

/* 
* Class1.h 
*/ 

#ifndef CLASS1_H_ 
#define CLASS1_H_ 

#include "Class2.h" 

namespace Class1_namespace 
{ 

class Class1 
{ 
    Class2* Class2_ptr; 
    void Class1_member() 
    { 
     (*Class2_ptr).Class2_method(); 
    } 
}; 

} 

#endif /* CLASS1_H_ */ 

/* 
* Class2.h 
*/ 

#ifndef CLASS2_H_ 
#define CLASS2_H_ 

#include "Class1.h" 

class Class2 
{ 
    Class1_namespace::Class1 Class2_data; 

public: 
    void Class2_method(){}; 
}; 

#endif /* CLASS2_H_ */ 

/* 
* main.cpp 
*/ 

#include "Class1.h" 

int main() 
{ 
    return 0; 
} 

Однако, это приводит к ошибке

Является ли эта ошибка вызвана упорядочением мои включения?

Каковы возможные решения? Я сомневаюсь в форвардных декларациях, решая мою проблему.

ответ

2

Класс 1 не должен включать Class2.

Если у вас есть взаимная зависимость (в которой вы не можете - вы можете просто не включать 2 в 1), вы обычно можете решить ее с помощью форвардных объявлений вместо включений.

Например, допустим, что Class1 выглядел как этот

#include "Class2.h" 

namespace Class1_namespace 
{ 

    class Class1 
    { 
     Class2* class2; 
    }; 

} 

Где вы думаете, что нужно включаемый, вы могли бы вместо того, чтобы сделать это:

class Class2; 

namespace Class1_namespace 
{ 

    class Class1 
    { 
     Class2* class2; 
    }; 

} 

нарушить взаимное включение.

+0

Всегда ли избегать взаимного включения или просто, когда достаточно заявлений на пересылку? – user383352

+0

Взаимное включение является симптомом циклических зависимостей, чего следует избегать, если это возможно. Если вы должны иметь циклическую зависимость, тогда ее можно обрабатывать только в том случае, если один из типов может быть объявлен вперед. Иначе вы не сможете скомпилировать свой код. –

+0

Если вы думаете о том, что на самом деле делает #include, вы увидите, почему он не может работать так, как у вас есть. Целью препроцессора является создание одного файла, который затем компилируется. Компилятор выполняет один проход через этот файл, поэтому все, что необходимо для класса, должно появиться перед ним. Запустите настройку компилятора только для предварительной обработки и просмотра файла результатов - вы увидите, что невозможно скомпилировать его в соответствии с этими ограничениями. –

0

В class1.h попробуйте удалить ненужный и круглый #include класса2.h. Если требуется циклическая зависимость - или даже если нет - рассмотрите возможность использования форвардных объявлений.

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