其他分享
首页 > 其他分享> > 在C模板类中存在循环依赖时修复包含的顺序

在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