Как организовать включения файлов?

Рейтинг: 0Ответов: 1Опубликовано: 09.10.2014

Здравствуйте. Есть файл "project.h", который включает все нужные .h:

#include "driver.h"
#include "animation.h"
#include "eventRec.h"
// etc

#include "a.h"
#include "b.h"

А также файлы "a.h" и "b.h" с одноименным классами внутри. Класс A включает объект класса B. Нужно подключить "a.h" и "b.h" с помощью "project.h" (чтобы у обоих был доступ к driver и пр.)

A.h:

#include "project.h"

class A 
{
private:
    B obj;
};

B.h:

#include "project.h"

class B
{
private:
    //something
};

При таком раскладе не компилируется - понятно - бесконечный цикл включения. Пробовал ставить include guardы в каждом файле:

#ifndef name_h
#define name_h

/* Тело класса */

#endif

При таком раскладе A не видит B.

error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "obj"
error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию

Помогите достичь цели.

Ответы

▲ 3Принят

Для начала: include guard'ы необходимы, без вопросов.

Затем: ошибка состоит в том, что вы пытаетесь облегчить себе жизнь, сделав «универсальный» header и пытаясь подключить его везде. Так не пойдёт. Включайте только то, что нужно, и только там, где нужно. Например:

A.h:

#ifndef A_H_INCLUDED
#define A_H_INCLUDED

#include "b.h"

class A 
{
private:
    B obj;
};

#endif

A.cpp:

#include "A.h"
#include "project.h"

...

B.h

#ifndef B_H_INCLUDED
#define B_H_INCLUDED

class B
{
private:
    //
};

#endif

B.cpp:

#include "B.h"
#include "project.h"

...