Тема: Глобальні змінні (або статичні у класі)
Не раз стикався з такою проблемою: потрібно між об'єктами різних класів передати данні.
Наприклад: Є класи А, В, С вони по різному опрацьовують setValue, мають вставляти дані в один і той самий стек.
Як бути в такому випадку ?
#include <iostream>
#include <stack>
std::stack<int> values;
class A
{
public:
virtual const int &getValue() const
{
int &a = values.top();
values.pop();
return a;
}
virtual void setValue(const int &value)
{
values.push(value + 1);
}
};
class B : public A
{
public:
void setValue(const int &value) override
{
values.push(value + 2);
}
};
class C : public A
{
public:
void setValue(const int &value) override
{
values.push(value + 3);
}
};
int main()
{
A obj1;
obj1.setValue(5);
B obj2;
obj2.setValue(5);
C obj3;
obj3.setValue(5);
std::cout<<obj1.getValue()<<'\n';
std::cout<<obj1.getValue()<<'\n';
std::cout<<obj1.getValue()<<'\n';
return 0;
}
Чому в класах С++ не можна створити статичну змінну ?
static std::stack<int> values;
Пробував якось обійти це... (хоча це ще гірший варіант...)
#include <iostream>
template<typename T>
class A
{
public:
static T &getStaticVar(const T &setStaticVar = 0)
{
static T staticVar = 0;
if(setStaticVar != 0)
staticVar = setStaticVar;
return staticVar;
}
};
int main()
{
A<int> obj;
obj.getStaticVar(5);/*Встановлюю 5 у об'єкт obj*/
std::cout<<A<int>::getStaticVar();/*беру значення без жодного об'єкту*/
return 0;
}
Що ж все таки робити, створювати глобальну змінну в просторі імен, використовувати патерни (як singleton наприклад), чи є, інша, краща ідея ?