Задать дефолтное значение для Singleton

216
28 марта 2018, 05:51

Имеется класс-синглтон для покрытия тестами используя gmock framework. Некоторые методы (как например method1() в примере) изменяют значения полей класса во время вызова. Есть ли какой-нибудь способ задавать дефолтные значения полям класса без изменения структуры класса?

Пример:

class TestingClass
{
private:
TestingClass(): _field1(0)
              , _field2(0)
{
}
TestingClass(const TestingClass&){}
TestingClass & operator=(const TestingClass &){}
public:
static TestingClass Instance()
{
    static TestingClass instance;
    return instance;
}
void method1()
{
    _field1 = 777;
}
void method2()
{
    _field1 = 888;
}
void Show()
{
    std::cout << "\nField1 - " << _field1
              << "\nField2 - " << _field2
              << "\n";
}
//other methods...

private:
int _field1;
int _field2;
};
Answer 1

Для гарантированной инициализации используете синглтон Майерса:

Foo& fooInstance(){
   static Foo value (init_value);
   return value;
}

Или так:

Foo& fooInstance(){
   static Foo value = []{
      Foo initValue;
      initValue.setValue(42);
      return initValue;
   }();
   return value;
}

В любом месте вызова этой функции будет возвращена корректная ссылка. В случае возможного многопоточного обращения сам класс Foo должен быть потокобезопасным, тогда и синглтон будет потокобезопасным (начиная с C++11).

P.S. В вашем коде достаточно инициализировать поля класса в конструкторе и возвращать в instаnce ссылку, а не копировать объект.

READ ALSO
Удаление Item&#39;a QGraphicsScene C++

Удаление Item'a QGraphicsScene C++

Вопрос заключается в следующем - инициализировал QGraphicsEllipseItem *ellipse и обозначил его на QGraphicsScene, как корректно будет удалить этот эллипс со сцены?

214
На чем написать MMO игровой сервер? (по типу (agar.io)

На чем написать MMO игровой сервер? (по типу (agar.io)

Хочу сделать браузерную игру по типу ИО-игр (agario, slither

207
Работа с виртуальной памятью С++

Работа с виртуальной памятью С++

Доброго времени суток, не могу разобраться как поместить элементы структуры данных (очередь, список, стек) в виртуальную память, которая выделяется...

244