Ошибка с двумя классами, которые #include друг друга - PullRequest
1 голос
/ 12 марта 2012

Допустим, у меня есть класс с именем Foo и другой с именем Bar.Bar содержит экземпляр Foo, и у меня есть функция в Foo, которая принимает Bar в качестве параметра.Однако, когда я #include "Bar.h" в Foo, чтобы разрешить Foo видеть Bar, я получаю эту ошибку в строках, на которые ссылается Bar:

ошибка: ISO C ++ запрещаетобъявление 'Foo' без типа

Я предполагаю, что это потому, что оба класса полагаются друг на друга при компиляции.Есть ли способ обойти это?

РЕДАКТИРОВАТЬ: Оба этих класса имеют заголовочные файлы, на которые другой класс ссылается в объявлении #ifndef.

Ответы [ 4 ]

3 голосов
/ 12 марта 2012

В Foo.h вместо Bar.h необходимо использовать предварительную декларацию class Bar;.Обратите внимание, что для этого вам нужно принять параметр Bar в качестве ссылки или указатель в Foo классе.

0 голосов
/ 12 марта 2012

Вам нужно будет использовать предварительное объявление как минимум для одного класса:

foo.h:

#include "Bar.h"

class Foo {

};

bar.h:

class Bar;

#include "Foo.h"

class Bar {

};

Также помните, что вы не можете легко ссылаться на членов Bar в Foo.h (они не объявлены). Таким образом, любые зарегистрированные участники, которым нужен Bar, должны будут зайти в Foo.cpp (или .cc, если вы предпочитаете). Вы также не можете иметь Bar в качестве ценностного члена Foo.

Итак:

class Bar {
    Foo f; // OK. Compiler knows layout of Foo.
};

class Foo {
    Bar b; // Nope. Compiler error, details of Bar's memory layout not known.
    Bar *b; // Still OK.
};

Это особенно сложно для шаблонов. См. FAQ , если у вас возникли проблемы.

0 голосов
/ 12 марта 2012
class Foo;

class Bar
{

};

and

class Bar;
class Foo
{
};

Но это может быть результатом неправильного дизайна !!

0 голосов
/ 12 марта 2012

Используйте ссылки или указатели для параметров и предварительных объявлений.Например,

//foo.h
class Bar;// the forward declaration
class Foo {
void myMethod(Bar*);
};

//foo.cpp
#include "bar.h"
void Foo::myMethod(Bar* bar){/* ... */}

//bar.h 
#include "foo.h"
class Bar {
  /*...*/
  Foo foo;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...