假设我有:
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
时,编译器仍然不知道这样的函数存在。我该如何解决这个问题?
答案 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)
错误是因为您尝试使用B
中A::bar
的方法。虽然类B
已被声明,但它尚未已定义。
与其他人说的一样,你应该将定义和实现分开,它会起作用。