Почему предварительное объявление не работает с классами? - PullRequest
3 голосов
/ 16 апреля 2010
int main() {
    B bb;                           //does not compile (neither does class B bb;)
    C cc;                           //does not compile

    struct t tt;                    //compiles

    class B {};                     //HERE is the class B defination
    struct s { struct t * pt; };    //compiles
    struct t { struct s * ps; };

    return 0;
}

class C {};

Я только что изменил приведенный пример здесь .

Почему работают объявления структуры forward, а не объявления класса forward?

Это как-то связано с пространствами имен - tag namespace и typedef namespace? Я знаю, что определения структуры без typedefs идут в пространство имен тегов.

Структуры - это просто классы со всеми открытыми членами. Поэтому я ожидаю, что они будут вести себя аналогично.

Ответы [ 4 ]

7 голосов
/ 16 апреля 2010

Форвардное объявление работает для классов, но не так, как вы ожидали.Сначала вы должны написать class B; перед кодом вашей main процедуры.Затем вы должны написать B * bb; вместо B bb;.Вы можете создать объект типа B только после определения класса.

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

4 голосов
/ 16 апреля 2010

Классовые форвардные объявления работают нормально; Вы просто не включили один. Добавить

class B;

выше bb декларации, и она будет работать

РЕДАКТИРОВАТЬ: Как указано kibibu , вы не можете объявить неполный тип, если это не указатель, поэтому

B* bb;

будет работать, но ваш путь не будет. Хороший звонок

1 голос
/ 16 апреля 2010

Ваша линия:

struct t tt;

Не компилируется для меня, я получаю:

.\TestApp.cpp(11) : error C2079: 'tt' uses undefined struct 'main::t'

(это Visual C ++ 2008)

1 голос
/ 16 апреля 2010

Я не думаю, что строка "struct t tt;" скомпилирует.

В C ++ struct и class одинаковы, за исключением разных прав доступа по умолчанию.

...