В консоль пишет:
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;
}
В чем дело?
Статические не константные члены должны быть инициализированы вне определения класса. Добавьте 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;
}
Ну, начнем с того, что вместо Apple->taste
нужно Apple::taste
.
А еще - напишите вот так:
static const int taste = 10;
и все будет OK. А если вы хотите его менять, то, увы, тогда его надо объявлять вне класса.
Дело в том, что статический неконстантный невстроенный член класса требует определения вне класса в файле реализации (т.е. в .cpp). Т.о. нужно написать:
int Apple::taste; // и при желании инициализировать = 10;
Инициализация должна быть именно в файле реализации, чтобы не было дублирования кода инициализации в других модулях, подключающих заголовочный файл.
Статический член класса по большому счёту ничем не отличается от обычной глобальной переменной, разве что возможностью ограничить к ней доступ через указание public/private/protected
и требованием писать полное имя (т.е. с именем класса) при доступе из-вне класса.
Если оставить определение в заголовочном файле, то мы получим ошибку множественного определения во всех модулях (кроме первого), подключающих его через #include
. А если добавим static
, то будут иметь свою копию переменной в каждом их них, что тоже, вряд ли соответствует желаемому поведению.
Начиная с c++17 появилась возможность объявлять статические неконстантные члены класса встроенными inline
. В таком случае определение вне класса не требуется:
class Apple {
public:
inline static int taste = 10; // ok
};
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть такой вот участок кода, который читае полученные AJAX данный в JSON формате(лишний код убран):