В консоль пишет:
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
};
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости