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