0

尽管有许多与此类似的问题,但我无法找到一个可以回答如此简单的问题的问题 - 但是由于数量众多,如果我错过了,您将不得不原谅我。

在以下代码中,会产生以下错误(使用 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之后移动 to ,但这无助于解释这里的潜在问题。SimpleClassCompoundFieldSimpleClass

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

4

1 回答 1

4

编译器看到这个

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass CompoundField;
};

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

因为它不知道要为多少整数、字符串等腾出空间——它举起手来。

但如果你这样做了

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass *CompoundField;
};

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

于 2013-03-07T02:51:07.920 回答