这可以被视为 C++ 中单例 class 的有效实现吗?
Can this be considered as a valid implementation of singleton class in C++?
#include <iostream>
using namespace std;
class Singleton {
public:
int val;
static int count;
Singleton() {
if (count == 1) throw 0;
Singleton::count++;
val = 100;
}
};
int Singleton::count = 0;
int main () {
try {
Singleton a, b;
} catch (...) {
cout << "error\n";
}
return 0;
}
所以我们统计创建对象的个数,当计数快要超过1时从构造函数中抛出。从构造函数中抛出会中止对象的创建吗?
C++11及以上:
您将构造函数设为私有并在静态函数中定义静态实例。它同步构造,因此无论有多少线程尝试访问它,对象都只构造一次:
class Singleton {
private:
Singleton() { /* ... */ }
public:
static auto& instance() {
static Singleton singleton;
return singleton;
}
};
C++11 之前的版本:
在 C++11(C++03、C++98)之前,没有同步对象构造的标准方法。您需要使用 OS 特定的技巧才能使其正常工作。
如果你是单线程程序,不关心同步问题,可以使用上面相同的版本。
#include <iostream>
using namespace std;
class Singleton {
public:
int val;
static int count;
Singleton() {
if (count == 1) throw 0;
Singleton::count++;
val = 100;
}
};
int Singleton::count = 0;
int main () {
try {
Singleton a, b;
} catch (...) {
cout << "error\n";
}
return 0;
}
所以我们统计创建对象的个数,当计数快要超过1时从构造函数中抛出。从构造函数中抛出会中止对象的创建吗?
C++11及以上:
您将构造函数设为私有并在静态函数中定义静态实例。它同步构造,因此无论有多少线程尝试访问它,对象都只构造一次:
class Singleton {
private:
Singleton() { /* ... */ }
public:
static auto& instance() {
static Singleton singleton;
return singleton;
}
};
C++11 之前的版本:
在 C++11(C++03、C++98)之前,没有同步对象构造的标准方法。您需要使用 OS 特定的技巧才能使其正常工作。
如果你是单线程程序,不关心同步问题,可以使用上面相同的版本。