所以我想说我有一个名为Foo
的课程,另一个叫Bar
。 Bar
包含Foo
的实例,我在Foo
中有一个以Bar
为参数的函数。但是,当我#include "Bar.h"
Foo
允许Foo
查看Bar
时,我会在引用Bar
的行上收到此错误:
错误:ISO C ++禁止声明'Foo'没有类型
我猜这是因为两个类都相互依赖进行编译。有没有办法解决这个问题?
编辑:这两个类都有头文件,其中另一个类在#ifndef
声明中被引用。
答案 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。