首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两个相互包含的类发生错误

两个相互包含的类发生错误
EN

Stack Overflow用户
提问于 2012-03-12 06:22:43
回答 3查看 314关注 0票数 1

假设我有一个名为Foo的类和另一个名为Bar的类。Bar包含Foo的一个实例,我在Foo中有一个函数,它将Bar作为参数。但是,当我在#include "Bar.h" in Foo中允许Foo看到Bar时,在引用Bar的行上会出现此错误:

错误: ISO C++禁止没有类型的“Foo”声明

我猜这是因为这两个类相互依赖来编译。有什么办法可以绕过这件事吗?

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

EN

回答 3

Stack Overflow用户

发布于 2012-03-12 06:25:39

Foo.h中,您需要使用前向声明class Bar;,而不是包含Bar.h。请注意,要使其工作,需要将参数Bar作为Foo类中的引用或指针。

票数 3
EN

Stack Overflow用户

发布于 2012-03-12 06:26:52

对参数和前向声明使用引用或指针。例如。

代码语言:javascript
代码运行次数:0
运行
复制
//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;
};
票数 0
EN

Stack Overflow用户

发布于 2012-03-12 06:34:37

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

Foo.h:

代码语言:javascript
代码运行次数:0
运行
复制
#include "Bar.h"

class Foo {

};

Bar.h:

代码语言:javascript
代码运行次数:0
运行
复制
class Bar;

#include "Foo.h"

class Bar {

};

还要注意,您不能在Foo.h中轻松地引用Bar的成员(它们没有声明)。因此,任何需要Bar的内联成员都必须使用Foo.cpp (如果您愿意的话可以使用.cc )。您也不能将Bar作为Foo的值成员。

所以:

代码语言:javascript
代码运行次数:0
运行
复制
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.
};

对于模板来说,这特别棘手。如果你有麻烦,请看常见问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9662557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档