Указатели на неполные типы


Рассмотрим следующее:

class Incomplete;

class Complete
{
    Incomplete* Foo; // Will only compile if Foo is a pointer.
};

class Incomplete
{
    Complete Bar; // Bar can be a pointer or an object.
};

Как законны указатели на неполные типы? Как компилятор узнает, насколько велик объект типа Incomplete? И поскольку онможет очевидно вычислить размер, почему регулярные объекты неполных типов незаконны?

1 3

1 ответ:

Причина, по которой указатели на неполные типы являются законными, заключается именно в том, что компилятору не нужно знать их размер.

Причина, по которой вы не можете объявить объект неполного типа, как вы уже упоминали, заключается в том, что компилятор не знает, насколько велик объект, и поэтому не может выделить для него место. Однако при объявлении указателя на неполный тип размер известен, поскольку обычно все указатели на машине имеют одинаковый размер. размер.

Кроме того, вам не нужно знать, насколько велик объект, когда объявляет указатель на объект неполного типа. Однако если вы попытаетесь использовать Объект неполного типа, например, следуя за этим указателем или пытаясь создать экземпляр объекта этого типа, то компилятор выдаст вам ошибку. Короче говоря, указатель является законным, потому что он может быть создан без компилятора, знающего размер того, на что он указывает. Если вам действительно нужно знать размер или расположение этого объекта с помощью указателя, однако, компилятор должен будет иметь больше информации о типе.