Указатели на неполные типы - PullRequest
3 голосов
/ 04 марта 2011

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

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?И поскольку он может , очевидно, определить размер, почему обычные объекты неполных типов недопустимы?

Ответы [ 4 ]

4 голосов
/ 04 марта 2011

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

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

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

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

4 голосов
/ 04 марта 2011

Размер указателя не зависит от размера типа, на который он указывает.int* и Incomplete* имеют одинаковый размер.

Однако для обычных объектов размер неизвестен.

1 голос
/ 04 марта 2011

Компилятору не нужно знать, насколько велик экземпляр Incomplete, потому что указатели всегда имеют одинаковый размер.

0 голосов
/ 04 марта 2011

Как компилятор узнает, насколько велик объект типа Incomplete?

Это не так. Он работает с указателем, потому что компилятор знает размер для выделения для указателя .

...