Инициализация статической переменной класса внутри главной - PullRequest
7 голосов
/ 15 января 2011

У меня есть статическая переменная в классе.Я инициализирую, что в глобальной области видимости все работает нормально.

Но при попытке инициализировать в основном компоновщике выдает ошибку.Почему это так.

class Myclass{

    static int iCount;
} ;

int main(){

  int Myclass::iCount=1;

}

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

int Myclass::iCount=1;

Как В моем классе я определяю iCount как целочисленный тип, почему нет.1009 *

   Myclass::iCount =1 ; in //Global scope

Ответы [ 5 ]

5 голосов
/ 15 января 2011

Раздел $ 9.4.2 / 7 из стандарта C ++ гласит:

Статические члены данных инициализированы и уничтожен точно так же, как нелокальный объекты (3.6.2, 3.6.3).

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

На самом деле статические члены больше похожи на глобальные объекты, доступ к которым осуществляется через Myclass::iCount. Итак, вы должны инициализировать их в глобальной области (той же области, в которой определен класс), например:

class Myclass{

    static int iCount;
} ;
int Myclass::iCount=1;

int main(){
  /*** use Myclass::iCount here ****/
}

Аналогичная тема:

Как статические переменные-члены влияют на размер объекта?

3 голосов
/ 15 января 2011

это правильный C ++. Вне функции, в файле cpp. инициализация выполняется в начале / запуске исполняемого файла. (даже до вызова main ());

//main.h

class Myclass{

    static int iCount;
}; // and don't forget this ";" after a class declaration


//main.cpp

int Myclass::iCount=1;

int main(){



}
3 голосов
/ 15 января 2011

Потому что синтаксис C ++ не позволяет этого. Вам нужно создать экземпляр вашей статической переменной вне области действия какой-либо функции.

Кроме того, вы забыли точку с запятой ; после скобки окончания класса.

2 голосов
/ 15 января 2011

Из стандарта C ++ (§8.5 / 10):

An initializer for a static member is in the scope of the member’s class.

класс Myclass имеет глобальную область видимости, и вы попытались инициализировать его статический член в более узкой области видимости функции main.

1 голос
/ 15 января 2011

Статическая инициализация происходит до того, как main вызывается во время выполнения инициализации.

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

...