Проблемы:
- нет защиты от множественного включения
- циклическое включение
- использование типа до его объявления, вызванного циклическим включением
Ваш foo.h, обрабатываемый препроцессором C, выглядит как бесконечная пустая последовательность строк.
С защитой от множественного включения foo.h предварительно обрабатывается так:
> cpp foo.h
class bar{ // preprocessed from #include "bar.h"
public:
static const int MY_DEFINE = 10;
foo::my_enum_type var;
bar() {};
~bar() {};
};
// end of #include "bar.h"
class foo{
public:
enum my_enum_type { ONE, TWO, THREE };
foo();
~foo() {}
};
Это, очевидно, неверный код C ++- foo используется в теле бара без предварительного объявления.C ++, в отличие от Java, требует, чтобы типы объявлялись перед использованием.
- Использовать защиту от множественного включения.В зависимости от вашей платформы это могут быть
#ifndef
макросы или #pragma once
директивы - Удалите включение bar.h из foo.h.
- Поместите предварительные объявления, где это необходимо (в вашем случае
bar
может быть объявлено в foo.h, ваш пример не показывает необходимости этого). - Переместите как можно больше реализации в * .cpp файлы.
Еслиситуация не может быть решена с помощью этих рекомендаций, используйте PIMPL идиома .
Короче - просто удалите директиву #include "bar.h"
из foo.h