c++循环引用,使用方法时出错,即使在前向声明之后

C++ circular reference, error when using methods, even after forward declaring

本文关键字:声明 之后 出错 引用 循环 使用方法 c++      更新时间:2023-10-16

假设我有:

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

当编译时,这个文件给出一个

错误"invalid use of incomplete type struct B",

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

forward声明不提供实现细节。BA所不知道的,除了它存在的事实。

要解决这个问题,请将声明与实现分开。

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

文件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();
}

将实现放在源文件中,而不是头文件中。

错误是因为您试图在A::bar中使用B的方法。虽然B类已经声明了,但还没有定义

就像其他人说的,你应该把定义和实现分开,这样就可以了。