Класс Singleton не работает с несколькими файлами - PullRequest
1 голос
/ 12 апреля 2020

Скажите, у меня есть этот код:

#include <iostream>
using namespace std;

class Something
{
    int field1;

    static Something *nill;
    static bool initialized;

    static void initialize() {
        if (initialized)
            return;
        initialized = true;
    }

public:
    static Something* Nill()
    {
        initialize();
        return nill;
    }

    static Something* Singleton(int field1)
    {
        initialize();
        Something *ret = new Something();
        ret->field1 = field1;

        return ret;
    }
}

Something* Something::nill = new Something();
bool Something::initialized = false;

int main(void)
{
    Something *smth = something->Nill();
    return 0;
}

Почему «Нечто» не является классом Singleton, и как я могу сделать его таким? Также, как я мог разделить этот код на 2 файла .h и a. cpp? У меня были проблемы с этим, потому что у меня есть некоторые глобальные переменные здесь, и я не знаю, как использовать их в других файлах ..

1 Ответ

1 голос
/ 12 апреля 2020

Это не одиночный класс. Класс Singleton подразумевает, что в любой момент времени вы не можете иметь более 1 экземпляра класса. В вашем примере вы не только создаете новый экземпляр, но даже возвращаете новые объекты класса в его методы.

Делайте конструктор по умолчанию защищенным (копируйте или перемещайте конструкторы, если вы действительно хотите быть уверены, что он как синглтон) ). Затем используйте свои данные c 'nill', как показано ниже:

class Something {
protected:
  Something() = default;
...

int main() {
  Something::nill->Nill();
...

Ps. Вы уверены, что вам нужен синглтон? Ваши методы говорят обратное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...