我遇到了循环依赖问题,其中包含标题的顺序很重要。 This问题类似,但它没有记录一个类实例化另一个对象的解决方案。
问题:
在下面的代码中,如果main.cpp在Foo.h之前包含Bar.h,则代码编译,而在Bar.h之前包含Foo.h时则不会。 有没有办法让代码编译,而不管main.cpp中包含头的顺序是什么?
foo.h中
#ifndef FOO_H
#define FOO_H
#include"Bar.h"
class Foo
{
public:
Bar<> B;
void fooStuff(){};
};
#endif
Bar.h
#ifndef BAR_H
#define BAR_H
class Foo;
template<int N=0> class Bar
{
public:
Foo * F;
void barStuff();
};
#include"Foo.h"
template<int N> void Bar<N>::barStuff()
{
F->fooStuff();
};
#endif
的main.cpp
#include"Foo.h"
#include"Bar.h"
int main()
{
Foo F;
F.B.barStuff();
};
答案 0 :(得分:4)
是:在Foo
之前声明Bar
,因为Bar
仅使用指针,而不需要完整定义。然后在Foo
之后定义Bar
- 它使用一个对象,因此它确实需要定义。
class Foo;
template<int N> class Bar
{
public:
Foo * M;
void barStuff();
};
class Foo
{
public:
Bar<42> B;
void fooStuff(){}
};
template<int N> void Bar<N>::barStuff()
{
M->fooStuff();
}
通常,您需要对需要该类的任何属性的任何内容(例如其大小或成员)的完整定义,以及在声明函数,指针或引用时仅使用类名称的声明。
答案 1 :(得分:2)
我需要在Foo之前包含Bar,无论它们包含在main.cpp中的顺序如何。以下黑客似乎有效:
在Foo.h中,包括Bar.h 在之外的标题保护。由于Bar也有头球防守,所以不会多次被包括在内。
<强> foo.h中强>
#include"Bar.h"
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Bar<> B;
void fooStuff(){};
};
#endif
<强> Bar.h 强>
#ifndef BAR_H
#define BAR_H
class Foo;
template<int N=0> class Bar
{
public:
Foo * F;
void barStuff();
};
#include"Foo.h"
template<int N> void Bar<N>::barStuff()
{
F->fooStuff();
};
#endif
<强>的main.cpp 强>
#include"Foo.h"
#include"Bar.h"
int main()
{
Foo F;
F.B.barStuff();
};