Ошибка при создании статического поля c++

211
29 сентября 2017, 18:51

В консоль пишет:

error: ISO C++ forbids in-class initialization of non-const static member 'Apple::taste'
#include <iostream>
#include <string>
using namespace std;
class Apple {
public:
    static int taste = 10; //ошибка error: ISO C++ forbids in-class initialization of non-const static member 'Apple::taste'|
};
int main()
{
    cout << Apple->taste << endl;
    cin.get();
    return 0;
}

В чем дело?

Answer 1

Статические не константные члены должны быть инициализированы вне определения класса. Добавьте int Apple::taste = 10;

#include <iostream>
#include <string>
using namespace std;
class Apple {
public:
    static int taste;
};
int Apple::taste = 10;
int main()
{
    cout << Apple::taste << endl;
    cin.get();
    return 0;
}
Answer 2

Ну, начнем с того, что вместо Apple->taste нужно Apple::taste.

А еще - напишите вот так:

static const int taste = 10;

и все будет OK. А если вы хотите его менять, то, увы, тогда его надо объявлять вне класса.

Answer 3

Дело в том, что статический неконстантный невстроенный член класса требует определения вне класса в файле реализации (т.е. в .cpp). Т.о. нужно написать:

int Apple::taste; // и при желании инициализировать = 10;

Инициализация должна быть именно в файле реализации, чтобы не было дублирования кода инициализации в других модулях, подключающих заголовочный файл.

Статический член класса по большому счёту ничем не отличается от обычной глобальной переменной, разве что возможностью ограничить к ней доступ через указание public/private/protected и требованием писать полное имя (т.е. с именем класса) при доступе из-вне класса.

Если оставить определение в заголовочном файле, то мы получим ошибку множественного определения во всех модулях (кроме первого), подключающих его через #include. А если добавим static, то будут иметь свою копию переменной в каждом их них, что тоже, вряд ли соответствует желаемому поведению.

Начиная с c++17 появилась возможность объявлять статические неконстантные члены класса встроенными inline. В таком случае определение вне класса не требуется:

class Apple {
public:
    inline static int taste = 10; // ok
};
READ ALSO
Выборка jq и Angular

Выборка jq и Angular

У меня есть таблица, данные там формируются с помощью ng-repeat

282
Выпадает символ при чтении параметра JSON

Выпадает символ при чтении параметра JSON

Есть такой вот участок кода, который читае полученные AJAX данный в JSON формате(лишний код убран):

289
Тень по центру, css, полукруглая тень

Тень по центру, css, полукруглая тень

Как сделать такую тень как на рисунке? те

353