Я хотел бы добавить несколько деталей к ответу Charles Bailey :
class A
{
public:
class B * b;
class C {} *c;
int d;
} a;
B* globalB;
// C* globalC; identifier "C" is undefined here
int main(int argc, char *argv[])
{
a.d = 1;
cout << a.d;
}
Да, он определяет неполный тип B
и b
как указатель на B
однажды.Но тут начинается самое интересное:
"Исключением из видимости области видимости объявления вложенного класса является случай, когда имя типа объявляется вместе с предварительным объявлением. В этом случае имя класса, объявленное предварительным объявлением,видимый вне охватывающего класса, с его областью действия, определяемой как наименьшая охватывающая область без класса. " ( Объявления вложенного класса )
Это означает, что тип B
определенвыходит за рамки A
, что позволяет определить переменную globalB
.Если вы не хотите, чтобы B
был определен вне области действия A
, вы можете использовать {}
так же, как он используется с типом C
в моем примере.
Кстати, этопример верный и вывод его: 1