未声明不完整类型的声明转发

时间:2013-03-07 02:45:01

标签: c++ class forward-declaration

尽管有许多与此类似的问题,但我找不到能够回答这么简单查询的问题 - 但是由于音量的原因,如果我错过了它,你将不得不原谅我。

在以下代码中,产生以下错误(使用G ++):'error: field 'CompoundField' has incomplete type'

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass CompoundField;
};

class SimpleClass{
    public:
    unsigned int SimpleField;
};

int main(){
    CompoundClass obj;
    obj.CompoundField.SimpleField=5;
    return 0;
}

为什么这两个班级都被前向宣布?一个直接的解决方案是将CompoundClass移至SimpleClass之后,或将CompoundField指向SimpleClass,但这无助于解释此处的根本问题。

更准确地说,其他答案表明这是由于编译器不知道类的大小(即SimpleClass),为什么这个大小为{{ 1}}可以相对轻松地找到?

1 个答案:

答案 0 :(得分:4)

编译器看到了这个

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass CompoundField;
};

需要弄清楚CompoundClass需要多少内存(没有关于SimpleClass内存要求的线索。)

因为它不知道有多少整数,字符串等......为它腾出空间 - 它会举起双手。

但如果你做了

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass *CompoundField;
};

然后它会知道 - 只需要一个指针(void *就足以应对所有可能性!)