具有非默认构造函数的单例类

时间:2018-10-04 03:28:27

标签: c++ class constructor singleton

我有一个func: () => {return this.name;} ,需要成为单身人士。一切都很好,只有它具有非默认构造函数,即它需要三个参数。 我能想到的最好的方法是设置构造器class,然后提供某种private“设置”功能。 有更好的解决方案吗?到目前为止,我的工作看起来像-欢迎提出任何改进建议!

public

3 个答案:

答案 0 :(得分:3)

您可以使用调用私有构造函数的静态工厂/获取函数。像这样:

class Foo {
public:
    static Foo& GetInstance() {
        static Foo foo(param1, param2);
        return foo;
    }
private:
    Foo(int a, int b) {
        // ...
    }
}

当然,这需要您的工厂函数以某种方式知道参数。

答案 1 :(得分:1)

适应Steve's Answer为单例类提供设置功能:

class Foo {
 public:
  static Foo& GetInstance() { return SetupInstance(-1, -1); }

  static Foo& SetupInstance(int a, int b) {
    static Foo foo(a, b);
    return foo;
  }

 private:
  Foo(int a, int b) {
    // ...
  }
};

由于static单例的构造函数仅被调用一次,因此多次调用SetupInstance不会重新创建Foo的新对象,而是始终返回创建的对象在第一次通话时。

答案 2 :(得分:1)

不要使用真实的单例(处理创建+唯一实例+全局访问),并对其进行调整:

class MyClass
{
private:
    int data = 0;
    int _AA;
    int _BB;
    int _CC;

    static std::unique_ptr<MyClass> uniqueInstance;

    MyClass(int AA, int BB, int CC) : _AA(AA), _BB(BB), _CC(CC) {}

    MyClass(const MyClass&) = delete;
    MyClass& operator =(const MyClass&) = delete;

public:

    static void Create(int AA, int BB, int CC)
    {
        // if (uniqueInstance) throw std::runtime_error("Call it only once");
        uniqueInstance = std::make_unique<MyClass>(AA, BB, CC);
    }

    static MyClass& GetInstance()
    {
         if (!uniqueInstance) throw std::runtime_error("Call Create before");
         return *uniqueInstance;
    }

    int getData() const { return this->data; }
    void setData(int data) { this->data = data; }
    int getAA() const { return _AA; }
};

std::unique_ptr<MyClass> MyClass::uniqueInstance;

int main(){
    MyClass::Create(111, 222, 333);
    auto& a = MyClass::GetInstance();
    std::cout << "dat " << a.getData() << " _AA " << a.getAA() << std::endl;
    a.setData(100);
    std::cout << "dat " << a.getData() << " _AA " << a.getAA() << std::endl;  
}