C++ C++;循环引用,使用方法时出错,即使在前向声明之后也是如此

C++ C++;循环引用,使用方法时出错,即使在前向声明之后也是如此,c++,compiler-errors,forward-declaration,circular-reference,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(); } 编译时,该文件提供 错误“无效使用不完整的类型结构B” 即使在我向前声明了类B之后。据我所

假设我有:

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

class B{
    private:
        A *a;
    public:
        bar(){ a->foo();}
        foo();
}
编译时,该文件提供

错误“无效使用不完整的类型结构B”


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

转发声明没有提供实现细节<代码>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();
}

转发声明未提供实施细节<代码>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();
}

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

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

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


正如其他人所说,您应该将定义和实现分开,这样它就会起作用。

错误是因为您试图在
a::bar
中使用
B
中的方法。虽然类
B
已声明,但尚未定义


正如其他人所说,您应该将定义和实现分开,这样就可以了。

请注意,您不必将函数定义移动到源文件中。如果要使它们保持内联,请将它们放在两个类定义之后的头文件中,并带有
内联
限定。@MikeSeymour内联限定只是一个编译器提示。即使将函数放在头文件或类定义中,也不会强制编译器内联它们。此外,编译器可以内联源文件中定义的函数。这可能只是一个“提示”,但几乎任何编译器都会内联这样一个非常小的函数,因为这样做可以提高速度和代码大小。有些编译器可以在转换单元之间内联函数,但许多编译器不能-如果您关心性能和可移植性,那么在可以的情况下,在头文件中内联定义简单函数是一个好主意。内联确实可以提高速度,但我看不出它如何可能提高代码大小。。。您应该将优化留给编译器。它可以通过不生成函数调用所需的代码以及(如果可能的话)不生成内联函数本身来改进代码大小。我同意你应该(通常)把优化留给编译器;我不同意您在这里的建议,即您应该故意阻止某些编译器进行优化,除非有特别的原因选择非内联定义。请注意,您不必将函数定义移动到源文件。如果要使它们保持内联,请将它们放在两个类定义之后的头文件中,并带有
内联
限定。@MikeSeymour内联限定只是一个编译器提示。即使将函数放在头文件或类定义中,也不会强制编译器内联它们。此外,编译器可以内联源文件中定义的函数。这可能只是一个“提示”,但几乎任何编译器都会内联这样一个非常小的函数,因为这样做可以提高速度和代码大小。有些编译器可以在转换单元之间内联函数,但许多编译器不能-如果您关心性能和可移植性,那么在可以的情况下,在头文件中内联定义简单函数是一个好主意。内联确实可以提高速度,但我看不出它如何可能提高代码大小。。。您应该将优化留给编译器。它可以通过不生成函数调用所需的代码以及(如果可能的话)不生成内联函数本身来改进代码大小。我同意你应该(通常)把优化留给编译器;我不同意你在这里的建议,你应该故意阻止一些编译器进行优化,除非有特别的原因喜欢非内联定义。