0

我有两个这样的课程:

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;
}

但是当我尝试编译时,它说

不完整类型“结构 A”的无效使用。

谁能告诉我如何解决这个问题?

4

3 回答 3

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;
}
于 2013-10-13T21:01:56.127 回答
0

这就是为什么建议将您的类分开在 .h 文件和 .cpp 文件中的原因。当你写的时候class B;,你是在告诉编译器有一个叫做 B 的类,但是就是这样,编译器不知道这个类里面是什么。当编译器到达 行时b->getctxt1();,它知道那b是 的实例B,但不知道是否getctxt1()是 的方法B,因为那在下面。如果您在一个文件中编写所有内容,则应首先编写所有声明,然后编写所有实现。

于 2013-10-13T21:04:34.640 回答
0

没有人注意到Class B语法错误吗?小写class是正确的。以及 A 中同名的两个公共成员int bB *b

删除这些并用分号完成类定义后,将 void 类型添加到void getctxt1()B 中缺少的类型。

只需定义应定义的功能。不要无缘无故地内联,你知道哪个是!

于 2013-10-13T21:19:21.847 回答