2015-01-14 1 views
0

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

Для example..the следующий код не компилируется как класс C не определено ....

class C; 
int main() 
{ 
    static C y; 
} 

Но почему следующий код компилируется, хотя класс B не определен?

class A 
{ 
    class B; 
    static B x; 
}; 

ответ

1

В первом случае (в main функции) объект y определен - так что требуется определение класса.

Во втором случае (в классе A) объявляется только член x - его необходимо определить в любом случае в обычном формате .cpp. В точке его определения потребуется определение C, но это не для объявления статического члена.

+0

Чтобы развернуть это, если 'x' был объявлен как нестатический член, это не будет компилироваться, поскольку нестатические члены * определены * в области видимости класса, а не только * объявлены *. – mbgda

1

Разница не в том, что один класс является внутренним классом, а другой - нет. Разница в том, что static означает что-то другое в области видимости класса и в области функций.

В области класса это означает класс (не для каждого экземпляра), а строка - это декларация. Вам нужно отдельное определение вне тела класса:

A::B A::x; // B must be complete here, and you can add an initializer 

В области видимости, это локальная переменная статической продолжительности хранения, а это означает, что он сохранит свое значение через вызовы функций. Строка - это определение само по себе, а не просто объявление, поэтому ему нужен полный тип.

1

Статический объект класса не может быть объявлен, если не определен класс ...

Не совсем. Он не может быть определен (или создан экземпляр, если хотите), если класс не определен (и, следовательно, полный тип); это может быть объявлено до тех пор, пока класс был объявлен (но может быть неполным типом, еще не определено).

следующий код не компилируется, так как не был определен класс C ....

Действительно, он пытался определить локальную переменную, которая требует определения класса.

Но почему следующий код компилируется, хотя класс B не определен?

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

A::B A::x; 

и тип должен быть полным (то есть, определено) в этой точке.