c ++: почему я не могу присвоить значение неконстантному статическому члену «внутри» класса? - PullRequest
0 голосов
/ 23 января 2019

Я новичок в C ++, и я просто не могу понять, что почему Я не могу присвоить значение неконстантному статическому члену внутри класса (например, мы делаем в java static int x = 12;) даже думал, что смогу

  • объявить неконстантный статический член (static int x;)
  • объявить статический член const (static const x;)
  • назначить статический константный член (static const int x = 12;)

примечание: мой класс и моя функция main () находятся в одном файле

Ответы [ 2 ]

0 голосов
/ 23 января 2019

В общем

Переменная static внутри класса, как и все остальные, по умолчанию представляет собой объявление . Затем C ++ требует от вас предоставить единственное определение для сущности, для которого оно требуется, - это правило единого определения. Определение - это то, куда идет инициализатор (который является не присваиванием, а конструкцией), поскольку также должен быть только один. Обычно он помещается в файл .cpp, поэтому его невозможно случайно скопировать с помощью #include s.

Постоянный регистр

Когда статический член является константным целым числом или перечислением и инициализируется выражением времени компиляции, инициализатор может быть помещен в объявление, а определение пропущено. Это результат комбинации старых правил и не очень интересный сегодня IMO.

Правильная встроенная инициализация

Поскольку в C ++ 17 введены inline переменные, вы можете использовать их как static членов. Правила примерно такие же, как у inline функций, и довольно разумны: вы можете предоставить множественное определение сущности inline, вы несете ответственность за то, чтобы все они были строго идентичны, а реализация ответственна за сведение их в одно определение с его инициализатором. Итак, то, что вы ищете, написано:

struct Foo {
    static inline int bar = 42;
    //     ^^^^^^
};
0 голосов
/ 23 января 2019

Вы должны инициализировать статический член вне определения класса, как в этом примере:

class Box {
   public:
      static int x;               
};

// Initialize static member of class Box outside the class definition
int Box::x = 12;

int main(void) {
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...