Гипотетическая ошибка неполного типа: объект против указателя - PullRequest
0 голосов
/ 06 апреля 2020

В гипотетической ситуации у меня есть два класса A и B.

Я пересылаю объявления A и B в начале этого заголовочного файла:

class A;
class B;

Позже я определяю класс B, и определите его следующим образом:

class B
{
public:
A aInstance;
}

По существу создайте объект типа A с именем aInstance в классе B.

Это возвращает неполную ошибку типа, однако,

class B
{
public:
A* aInstance;
}

нет.

Что именно в объявлении объекта bInstance как указателя устраняет эту ошибку? Я в основном ищу объяснение, чтобы помочь мне лучше понять указатели, потому что мое понимание их в настоящее время не очень строгое.

Спасибо

1 Ответ

1 голос
/ 06 апреля 2020

В двух словах, одна вещь, которую компилятор знает из определения класса, - это размер экземпляра этого класса. Здесь компилятор имеет все, что ему нужно знать, потому что размер указателя не зависит от того, на что он указывает:

struct B {
    A* aInstance;
};

Размер B - это размер указателя плюс потенциально заполнитель. Однако здесь:

struct B {
    A aInstance;
};

Размер B - это размер экземпляра A, и необходимо знать, что необходимо определение A.

...