C ++循环引用,使用方法时出错,甚至在前向声明之后

时间:2011-11-08 12:08:53

标签: c++ compiler-errors forward-declaration circular-reference

假设我有:

class B;
class A{
    private:
        B *b;
    public:
        bar(){ b->foo()};
        foo();
}

class B{
    private:
        A *a;
    public:
        bar(){ a->foo();}
        foo();
}

编译时,此文件提供

  

错误“无效使用不完整类型struct B”,

即使我已经向前声明了B类。据我所知,这是因为当我在foo()上调用函数b时,编译器仍然不知道这样的函数存在。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:10)

前向声明不提供任何实现细节。 B不知道A,除了它存在的事实。

要解决此问题,请将声明与实施分开。

您还缺少方法的返回类型。

档案A.h:

class B;
class A{
    private:
        B *b;
    public:
        void bar();
        void foo();
};

文件A.cpp:

#include "A.h"
#include "B.h"
void A::bar(){ 
   b->foo();
}

文件B.h:

class A;
class B{
    private:
        A *a;
    public:
        void bar();
        void foo();
};

文件B.cpp:

#include "B.h"
#include "A.h"
void B::bar(){ 
   a->foo();
}

答案 1 :(得分:1)

将实现放在源文件中而不是标题中。

答案 2 :(得分:1)

错误是因为您尝试使用BA::bar的方法。虽然类B已被声明,但它尚未已定义

与其他人说的一样,你应该将定义和实现分开,它会起作用。