У меня есть шаблон включения следующим образом: «„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;
}
Однако, это приводит к ошибке
Является ли эта ошибка вызвана упорядочением мои включения?
Каковы возможные решения? Я сомневаюсь в форвардных декларациях, решая мою проблему.
Всегда ли избегать взаимного включения или просто, когда достаточно заявлений на пересылку? – user383352
Взаимное включение является симптомом циклических зависимостей, чего следует избегать, если это возможно. Если вы должны иметь циклическую зависимость, тогда ее можно обрабатывать только в том случае, если один из типов может быть объявлен вперед. Иначе вы не сможете скомпилировать свой код. –
Если вы думаете о том, что на самом деле делает #include, вы увидите, почему он не может работать так, как у вас есть. Целью препроцессора является создание одного файла, который затем компилируется. Компилятор выполняет один проход через этот файл, поэтому все, что необходимо для класса, должно появиться перед ним. Запустите настройку компилятора только для предварительной обработки и просмотра файла результатов - вы увидите, что невозможно скомпилировать его в соответствии с этими ограничениями. –