实现单一实例模式

Implementing the singleton pattern

本文关键字:模式 实例 单一 实现      更新时间:2023-10-16
using namespace std;
class PersonA{
    private:
    PersonA(){cout << "PersonA cconstr called" << endl;};
    public:
    PersonA* createInstance(){
        cout << "Instance created" << endl;
        return new PersonA;
    };
};
int main()
{
    PersonA* Hello = PersonA::createInstance();
    return 0;
}

我的IDE给我一个错误,上面写着:调用不带参数的非静态成员函数我不明白为什么这种方法需要参数?我错过了什么吗?

缺少

static

但是您目前没有实现单例模式,如果您愿意,请使用 Meyers 的模式:

class PersonA
{
private:
    PersonA() { std::cout << "PersonA constr called" << std::endl;}
public:
    PersonA(const PersonA&) = delete;
    PersonA& operator =(const PersonA&) = delete;
    static PersonA& getInstance(){
        static PersonA instance{};
        return instance;
    }
};

但也许你只需要一个工厂方法,然后避免原始拥有指针,并使用智能指针:

class PersonA{
private:
    PersonA() { std::cout << "PersonA constr called" << std::endl;}
public:
    std::unique_ptr<PersonA> create()
    {
        std::cout << "Instance created" << std::endl;
        return std::make_unique<PersonA>();
    }
};

你可以这样做 -

#include <iostream>
using namespace std;
class PersonA{
    private:
    PersonA(){cout << "PersonA cconstr called" << endl;};
    static PersonA* p;
    public:
    static PersonA* createInstance(){
        if(p == nullptr)
        {
            cout << "Instance created" << endl;
            p= new PersonA();
        }
        return p;
    };
};
PersonA* PersonA::p=nullptr;
int main()
{
    PersonA* A = PersonA::createInstance();
    PersonA* B = PersonA::createInstance();
    return 0;
}