关于前向声明c ++类

时间:2013-10-13 20:55:56

标签: c++ forward-declaration

我有两个这样的课程:

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'。

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

3 个答案:

答案 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();时,它知道bB的实例,但它不知道getctxt1()是否是B的方法,因为那是在下面。如果您在一个文件中编写所有内容,则应首先编写所有声明,然后编写所有实现。

答案 2 :(得分:0)

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

删除它们并用分号完成类定义后,向B中缺少它的void getctxt1()添加一个void类型。

只需定义应定义的函数。没有理由你不知道是哪个!