У вас есть круговая зависимость: includes.h -> clientclass.h -> includes.h
. Как это решить, зависит от того, какой заголовок будет включен первым, но это всегда будет сбивать с толку. Скорее всего это вызывает линию
#include <clientclass.h>
для успешного выполнения, но не для включения содержимого, так как защита для включения CLIENTCLASS_H_INCLUDED
уже была определена, хотя содержимое еще не существует.
Чтобы решить эту проблему, вы можете просто удалить включение includes.h
из clientclass.h
, если оно не используется ни для чего. Если вы используете типы из includes.h
, вы можете использовать предварительные объявления, которые объявляют, что класс существует без его определения, например,
class ClientClass;
Таким образом, вы можете использовать указатели и ссылки на ClientClass
без необходимости включать clientclass.h
. Чего вы не можете сделать, так это объявить значения объявленных вперед типов, так как компилятор должен знать все о типе (по крайней мере, насколько он велик), прежде чем он сможет зарезервировать память для значения этого тип. Если вам это нужно, возможно, вам придется разбить заголовок на более мелкие части и включить только малую часть, от которой вы зависите.
Так, например, вы можете сделать следующее:
class MyClass;
MyClass * globalPointer;
void doSomething(const MyClass & foobar);
без определения MyClass
в области видимости. Два выражения здесь используют MyClass
только через указатель или ссылку. Но следующее не сработает:
class MyClass;
void doSomethingElse() {
MyClass theobject;
doSomething(theobject);
}
Для этого требуется зарезервировать место в стеке для объекта типа MyClass
. Без определения MyClass
в области видимости компилятор не сможет узнать, сколько памяти выделить.
В вашем случае вы определяете глобальные значения типа ClientClass
, и для этого требуется полное определение ClientClass
, а не просто предварительное объявление. У вас есть несколько вариантов:
- Далее разбейте включаемые файлы, чтобы вы могли включить только малую часть, которая вам нужна
- Удерживайте ваше глобальное значение указателем и выделите его где-нибудь позже в коде после того, как вы включили полное определение
ClientClass
Другой вариант - пересмотреть, являются ли глобальные переменные здесь правильным решением.