两个类#include彼此的错误

时间:2012-03-12 06:22:44

标签: c++ include

所以我想说我有一个名为Foo的课程,另一个叫BarBar包含Foo的实例,我在Foo中有一个以Bar为参数的函数。但是,当我#include "Bar.h" Foo允许Foo查看Bar时,我会在引用Bar的行上收到此错误:

  

错误:ISO C ++禁止声明'Foo'没有类型

我猜这是因为两个类都相互依赖进行编译。有没有办法解决这个问题?

编辑:这两个类都有头文件,其中另一个类在#ifndef声明中被引用。

4 个答案:

答案 0 :(得分:3)

Foo.h中,您需要使用转发声明Bar.h而不是class Bar;。请注意,为此,您需要将参数Bar作为参考或Foo类中的指针。

答案 1 :(得分:0)

使用参数和指针进行参数和转发声明。 E.g。

//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;
};

答案 2 :(得分:0)

class Foo;

class Bar
{

};

and

class Bar;
class Foo
{
};

但这可能是设计错误的结果!!

答案 3 :(得分:0)

您需要为至少一个类使用前向声明:

foo.h中:

#include "Bar.h"

class Foo {

};

Bar.h:

class Bar;

#include "Foo.h"

class Bar {

};

还要注意你不能在Foo.h中轻易引用Bar的成员(它们未被声明)。因此,任何需要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