使用未定义的类/具有不完整的类型

时间:2013-12-26 20:59:29

标签: c++

class a;
class b;

class a {
    b c;
};

class b {
};

为什么不编译?我的印象是,如果你宣布了类的原型,它们的声明顺序并不重要。但是,这不起作用。在视觉工作室,它给了我:

error C2079: 'a::c' uses undefined class 'b'

在g ++中,它给了我:

error: field 'c' has incomplete type

我做错了什么?

2 个答案:

答案 0 :(得分:2)

当编译器看到

class a {
  b c;
};

它知道b存在,但它不知道它是什么(因此,它不知道它需要多少空间,因此它不知道如何构建{{1} })

但是,您可以使用a上的指针:

b

编辑:

这意味着您无法在定义class a { b* c; }; 之前对其进行操作。例如:你无法做到

b

可以执行的操作class a { b* c; void f(){ c->doSomething(); // <- Won't compile } }; a中的.hh定义分开:

在a.hh

.cc

在a.cc

class b; //Say it exists. Don't say what it looks like

class a {
  b* c;
  void f();
};

答案 1 :(得分:0)

a使用b时,它已被声明(因为您在其上面写了class b;)但未定义(定义低于a)。 “不完整类型”表示已声明但未定义的类型。