【问题标题】:incomplete type error不完整的类型错误
【发布时间】:2012-05-04 09:48:55
【问题描述】:

我想让 A 班成为 B 班的朋友。

class B;

class A{
public:
void show(const B&); // ##1## but this one works fine  
B ob;// error incomplete type

};


class B{
public:
int b;
B():b(1){}
friend class A;  

};

所以我的问题是为什么它是不完整的类型?我认为当我执行class B 时,它就像一个函数原型,它告诉编译器在代码中的某处有一个定义。

也在上面的代码中 ##1## 为什么这是可能的?

【问题讨论】:

  • 相反,您可以将成员作为指向 B (B* ob) 的指针

标签: c++ friend forward-declaration


【解决方案1】:

不,这是一个前向声明,并没有定义完整的类型。如果要将成员保留为对象而不是指针,则需要在 A 之前对 B 进行完整定义。

其中一个原因是A 必须知道类B 的大小,因为A 的大小取决于B

我建议你在A.h#include "B.h"

编辑:澄清:

struct A;

struct B
{
   A foo();
   void foo(A);
   void foo(A&);
   void foo(A*);

   A* _a;
   A& __a;
   A a;  // <--- only error here
};

【讨论】:

  • 值得注意的是引用很好,因为你不需要知道一个类型的细节来引用它。
  • @AlexDan 引用和指针不需要知道声明中的类的任何信息,除非它存在。
  • @LuchianGrigore :谢谢,但即使我将函数 show 的参数从 show(const B&) 更改为 show(const B) 它也可以正常工作。
  • @AlexDan 成员可以是不知道完整类型的指针或引用,返回类型和参数类型可以是不完整类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多