繁体   English   中英

关于前向声明c ++类

[英]Regarding forward declaration c++ class

我有两个这样的课程:

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

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

内联类成员函数定义被解析,就好像它们出现在类定义之后。 当然, 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;
}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM