在C模板类中存在循环依赖时修复包含的顺序
作者:互联网
我遇到了一个循环依赖问题,其中包含标题的顺序很重要. This问题类似,但它没有记录一个类实例化另一个对象的解决方案.
问题:
>我有两个班:Foo和Bar.酒吧是模板化的. (Foo可能会也可能不会被模板化).
> Foo有一个Bar实例,Bar有一个Foo类型的指针,Bar的实现需要通过这个指针访问Foo的成员.
> Foo和Bar必须在单独的文件中实现.由于Bar是模板化的,它的声明和实现必须在同一个文件中.
在下面的代码中,如果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();
};
解决方法:
是的:在Bar之前声明Foo,因为Bar只使用指针,它不需要完整的定义.然后在Bar之后定义Foo – 它使用一个对象,因此它确实需要定义.
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();
}
通常,您需要对需要该类的任何属性的任何内容(例如其大小或成员)的完整定义,以及在声明函数,指针或引用时仅使用类名称的声明.
标签:c,circular-dependency 来源: https://codeday.me/bug/20190826/1728049.html