gpt4 book ai didi

调用方法时的 C++ 前向声明问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:08 25 4
gpt4 key购买 nike

我有一个问题,我认为它与前向声明有关,但也许不是。

相关代码如下:

啊啊

#ifndef A_H_
#define A_H_

#include "B.h"

class A
{
private:
B b;

public:
A() : b(*this) {}

void bar() {}
};

#endif /*A_H_*/

B.h

#ifndef B_H_
#define B_H_

#include "A.h"

class A;

class B
{
private:
A& a;

public:
B(A& a) : a(a) {}

void foo() { /*a.bar();*/ } //doesn't compile
};

#endif /*B_H_*/

主要.cpp

#include "A.h"

int main()
{
A a;

return 0;
}

问题似乎出在 A::bar() 的调用上。程序成功编译,直到我尝试调用此方法,此时出现两个错误:

error: invalid use of incomplete type ‘struct A’

error: forward declaration of ‘struct A’

我认为这是因为 A::bar() 尚未定义或声明,因为两个 header 相互引用。但是,我转发了已声明的 A 级并且不知道我还需要做什么。我是 C++ 的新手,所以请原谅我。我在网上其他任何地方都找不到这个问题的答案。一如既往,提前致谢!

最佳答案

你有一个循环引用,所以你需要分开 B.h.尝试类似的东西:

B.h:

#ifndef B_H_
#define B_H_

// don't include A.h here!

class A;

class B
{
private:
A& a;

public:
B(A& a) : a(a) {}

void foo();
};

#endif /*B_H_*/

B.cpp:

#include "B.h"
#include "A.h"

void B::foo() { a.bar(); } // now you're ok

编辑:解释为什么需要将它分成两个文件:

B 类包含对A 的引用,它可以是所谓的不完整 类型。你不能在它上面调用任何函数,因为编译器还不知道 A 到底是什么——它只知道它是某种类。一旦包含 A.h(在 .cpp 文件中),A 就是一个完整的类型,您可以随意使用它。

你不能把所有的东西都放在一个头文件中,因为你会得到一个循环引用。你正在用你的 include 守卫防止无限循环,但你得到了你不想要的东西。看看编译器在编译 main.cpp 时的结果,就像之前一样:

// #include "A.h" ==>
#define A_H_

// #include "B.h" ==>
#define B_H_

// #include "A.h" ==> nothing happens! (since A_H_ is already defined)

class A;

class B {
private:
A& a;

public:
B(A& a) : a(a) {}

void foo() { a.bar(); } // <-- what the heck is A here?
// it's not defined until below
};

class A {
private:
B b;

public:
A() : b(*this) {}

void bar() {}
};

int main() {
A a;
return 0;
}

关于调用方法时的 C++ 前向声明问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/460281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com