我有两个这样的课程:
class B;
class A {
public:
int a, b;
B *b;
public:
int getctxt()
{
b->getctxt1();
}
}
Class B {
public:
int c,d;
A *a;
getctxt1()
{
/* something */
}
}
main()
{
B *b = new B();
A *a = new A();
b->a = a;
a->b = b;
}
但是当我尝试编译时,它会说
无效使用不完整类型'struct A'。
谁能告诉我如何解决这个问题?
答案 0 :(得分:2)
内联类成员函数定义被解析,就好像它们出现在类定义之后。当然,此时未定义B
。因此,将A::getctxt
的成员函数定义移出类A
的定义:
class B;
class A { int getctxt(); /* ... */ };
class B { /* ... */ };
int A::getctxt()
{
b->getctxt1(); // at this point, *b has complete type!
return -35;
}
答案 1 :(得分:0)
这就是为什么建议在.h文件和.cpp文件中分隔类的原因。当你写class B;
时,你告诉编译器有一个叫做B的类,但就是这样,编译器不知道这个类里面有什么。当编译器到达行b->getctxt1();
时,它知道b
是B
的实例,但它不知道getctxt1()
是否是B
的方法,因为那是在下面。如果您在一个文件中编写所有内容,则应首先编写所有声明,然后编写所有实现。
答案 2 :(得分:0)
没有人注意到Class B
语法错误?小写class
是正确的。
A中的两个公共成员名称为int b
和B *b
。
删除它们并用分号完成类定义后,向B中缺少它的void getctxt1()
添加一个void类型。
只需定义应定义的函数。没有理由你不知道是哪个!