c++循环引用,使用方法时出错,即使在前向声明之后
C++ circular reference, error when using methods, even after forward declaring
假设我有:
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声明不提供实现细节。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
类已经声明了,但还没有定义。
就像其他人说的,你应该把定义和实现分开,这样就可以了。
相关文章:
- 类的前向声明之后的类成员函数定义,在类声明之前
- 在实例化封闭类模板之后,我们可以声明模板类成员的部分专用化吗
- 错误:函数声明符之后的预期函数体
- 在函数声明之后声明整数有什么用?
- 在基类中使用派生类,而在基类之后声明派生类
- 为什么即使在启用 C++11 并且我包含字符串之后,'stod'仍然没有在此范围内声明?
- 为什么"override/final"需要放在函数声明符之后?
- C 错误:在公众之后,没有在此范围内声明此范围
- 在声明C++之后初始化常量变量
- 头文件中的 std::vector 声明之后的奇怪数据
- 如果我在 for 中声明一个对象,它的内存是否会在那之后被释放?
- 当 const 放在函数的声明之后是什么意思?
- 是在类定义之后允许的类声明
- 在定义成员类之后重新声明它是否合法?
- c++循环引用,使用方法时出错,即使在前向声明之后
- 在限定的声明符-id之后查找名称
- 检查在模板第一个参数之后声明的函数是否为 NULL(传递向量和数组)
- 为什么重写出现在成员声明之后,而不是与virtual相同的位置
- 类的函数声明之后"default"是什么意思?
- 应为;在声明错误c++Xcode之后