Похоже, ошибка в том, что у вас есть два заголовочных файла, которые находятся по кругу друг в друге - intersection.h и road.h.Это может привести к странным сюрпризам в C ++ из-за того, как работают охранники включения.Например, предположим, что у меня есть два заголовочных файла, которые выглядят следующим образом:
// File: A.h
#ifndef A_Included
#define A_Included
#include "B.h"
class A {};
void MyFunction(B argument);
#endif
и
// File: B.h
#ifndef B_Included
#define B_Included
#include "A.h"
class B {};
void MyOtherFunction(A argument);
#endif
Теперь, если я попытаюсь #include "A.h"
, он расширится до
// File: A.h
#ifndef A_Included
#define A_Included
#include "B.h"
class A {};
void MyFunction(B argument);
#endif
Когда я пытаюсь расширить #include "B.h"
, я получаю это:
// File: A.h
#ifndef A_Included
#define A_Included
// File: B.h
#ifndef B_Included
#define B_Included
#include "A.h"
class B {};
void MyOtherFunction(A argument);
#endif
class A {};
void MyFunction(B argument);
#endif
В этот момент препроцессор снова попытается расширить A.h
, что приводит к этому:
// File: A.h
#ifndef A_Included
#define A_Included
// File: B.h
#ifndef B_Included
#define B_Included
// File: A.h
#ifndef A_Included
#define A_Included
#include "B.h"
class A {};
void MyFunction(B argument);
#endif
class B {};
void MyOtherFunction(A argument);
#endif
class A {};
void MyFunction(B argument);
#endif
Теперь давайте посмотрим, что произойдет, когда мы разрешим все эти странные охранники.Когда мы видим A в первый раз, он расширяется, как и в случае, когда мы расширяем B впервые.Однако, когда мы видим A во второй раз, он вообще не раскрывается.Таким образом, после извлечения комментариев и директив препроцессора мы получаем следующий результирующий код:
class B {};
void MyOtherFunction(A argument);
class A {};
void MyFunction(B argument);
Обратите внимание, что когда объявлено MyOtherFunction
, A
еще не объявлено, и поэтому компилятор сообщает об ошибке.
Чтобы это исправить, вы можете заранее объявить A
и B
в заголовочных файлах, которым они нужны:
// File: A.h
#ifndef A_Included
#define A_Included
class A {};
class B; // Forward declaration
void MyFunction(B argument);
#endif
и
// File: B.h
#ifndef B_Included
#define B_Included
class B {};
class A; // Forward declaration
void MyFunction(B argument);
#endif
Теперь больше нет циклических зависимостей.Пока вы #include
соответствующие заголовочные файлы в .cpp файлах, у вас все будет хорошо.
Надеюсь, это поможет!