下面我将详细讲解使用智能指针实现模板形式的单例类的完整攻略。
1. 什么是智能指针?
智能指针是一个 C++ 类,它的实例行为类似于指针,不过它添加了自动内存回收的管理功能。智能指针中最常用的是 std::shared_ptr 和 std::unique_ptr。
我们使用智能指针可以避免内存泄漏和空悬指针,避免程序崩溃等问题。
2. 什么是模板形式的单例类?
单例模式指的是某个类只能够创建一个实例,这个实例可以被全局访问。在实际开发中,单例模式常用于表示系统中的一个全局状态或全局对象。
模板形式的单例类可以产生任意类型的单例,也就是说单例类不再是某个具体的类型,而是被指定为一个类型。比如,我们可以定义一个模板类,这个模板类可以用来产生“int”类型的单例,也可以用来产生“double”类型的单例。
3. 使用智能指针实现模板形式的单例类
我们可以使用 std::shared_ptr 来实现一个模板形式的单例类,其步骤如下:
3.1 定义单例类模板
我们定义一个单例类模板 Singleton,它有一个静态成员指针 pInstance
,表示单例对象的指针。在 Singleton 构造函数中,我们进行了判断,如果指针为空,则创建一个新的实例并将指针赋值为该实例的地址。
template<typename T>
class Singleton
{
public:
static std::shared_ptr<T> getInstance() {
if (!pInstance) {
pInstance = std::shared_ptr<T>(new T);
}
return pInstance;
}
private:
static std::shared_ptr<T> pInstance;
};
template<typename T>
std::shared_ptr<T> Singleton<T>::pInstance = nullptr;
3.2 使用单例类模板
我们可以使用 Singleton
比如,我们可以定义一个单例类 TestClass,其只有一个无参构造函数,并且提供一个输出函数:
class TestClass
{
public:
TestClass() {
std::cout << "TestClass constructed!" << std::endl;
}
void printName() {
std::cout << "This is a test class!" << std::endl;
}
};
然后使用 Singleton 模板来产生一个 TestClass 的单例对象:
int main() {
auto instance1 = Singleton<TestClass>::getInstance();
auto instance2 = Singleton<TestClass>::getInstance();
std::cout << "instance1's address: " << instance1.get() << std::endl;
std::cout << "instance2's address: " << instance2.get() << std::endl;
instance1->printName();
instance2->printName();
return 0;
}
输出结果为:
TestClass constructed!
instance1's address: 0x7fdebc000f60
instance2's address: 0x7fdebc000f60
This is a test class!
This is a test class!
说明 Singleton
3.3 示例2
我们再以 STL 中的 std::vector 为例来演示一下,创建一个 Singleton
int main() {
auto instance1 = Singleton<std::vector<int>>::getInstance();
auto instance2 = Singleton<std::vector<int>>::getInstance();
instance1->push_back(1);
instance1->push_back(2);
std::cout << "*instance2.begin(): " << *instance2.begin() << std::endl;
std::cout << "instance1->size(): " << instance1->size() << std::endl;
std::cout << "instance2->size(): " << instance2->size() << std::endl;
return 0;
}
输出结果为:
*instance2.begin(): 1
instance1->size(): 2
instance2->size(): 2
说明 Singleton
4. 总结
使用智能指针实现模板形式的单例类,可以更加方便、安全的管理单例对象,避免程序出现内存泄漏、空悬指针等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++使用智能指针实现模板形式的单例类 - Python技术站