尽管有许多与此类似的问题,但我找不到能够回答这么简单查询的问题 - 但是由于音量的原因,如果我错过了它,你将不得不原谅我。
在以下代码中,产生以下错误(使用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}}可以相对轻松地找到?
答案 0 :(得分:4)
编译器看到了这个
class SimpleClass;
class CompoundClass;
class CompoundClass{
public:
SimpleClass CompoundField;
};
需要弄清楚CompoundClass
需要多少内存(没有关于SimpleClass
内存要求的线索。)
因为它不知道有多少整数,字符串等......为它腾出空间 - 它会举起双手。
但如果你做了
class SimpleClass;
class CompoundClass;
class CompoundClass{
public:
SimpleClass *CompoundField;
};
然后它会知道 - 只需要一个指针(void *
就足以应对所有可能性!)