赞
踩
// 定义一个模板结构体 IsPointer,用于判断类型是否为指针类型 template <typename T> struct IsPointer { static const bool value = false; }; template <typename T> struct IsPointer<T*> { static const bool value = true; }; // 利用 IsPointer 类型结构体判断是否为指针类型,并输出结果 template <typename T> void CheckIfPointer() { if (IsPointer<T>::value) { std::cout << "类型 " << typeid(T).name() << " 是指针类型\n"; } else { std::cout << "类型 " << typeid(T).name() << " 不是指针类型\n"; } } // 假设有一个需要管理的类 class MyClass { public: void greet() { std::cout << "Hello from MyClass!" << std::endl; } }; //测试代码 void test(){ CheckIfPointer<int>(); // 检查 int 类型 CheckIfPointer<float*>(); // 检查 float* 类型 CheckIfPointer<std::string>(); // 检查 std::string 类型 }
是 C++ 中的一个重要概念,用于管理动态分配的内存,可以帮助避免内存泄漏和悬空指针等问题。下面是智能指针的一些好处:
//TODO: 实现一个智能指针模板类 //原理:利用类在构造时初始化,析构时销毁的特性, //把一个类的内存管理委托到模板类上面,实现内存自动管理 template <class T> class SmartPointer { private: T* ptr; public: SmartPointer(T* p) : ptr(p) {} ~SmartPointer() { delete ptr; } T& operator*() { return *ptr; } T* operator->() { return ptr; } };
SmartPointer 是一个模板类,它接受一个模板参数 T,表示指针指向的类型。在类中包含一个私有指针 ptr,用于管理动态分配的内存。构造函数接受一个指向 T 类型对象的指针,并将其存储在 ptr 中。析构函数负责释放 ptr 指向的内存。此外,重载了 * 和 -> 运算符,以便通过智能指针访问指向的对象。
//TODO: 实现共享指针,在智能指针的基础上加上引用计数, //通过适当增加和减少引用计数,可以确保正确地共享资源并在不再需要时释放资源 template <class T> class SharedPointer { private: T* ptr; int* refCount; public: SharedPointer(T* p) : ptr(p), refCount(new int(1)) {} SharedPointer(const SharedPointer<T>& other) : ptr(other.ptr), refCount(other.refCount) { (*refCount)++; } ~SharedPointer() { (*refCount)--; std::cout << "~SharedPointer()" << std::endl; if (*refCount == 0) { delete ptr; delete refCount; } } SharedPointer<T>& operator=(const SharedPointer<T>& other) { if (this != &other) { (*refCount)--; if (*refCount == 0) { delete ptr; delete refCount; } ptr = other.ptr; refCount = other.refCount; (*refCount)++; } return *this; } T& operator*() { return *ptr; } T* operator->() { return ptr; } };
//测试代码 // 假设有一个需要管理的类 class MyClass { public: void greet() { std::cout << "Hello from MyClass!" << std::endl; } }; typedef SmartPointer<MyClass> myClassPtr; typedef SharedPointer<MyClass> myClassSharedPtr; void test(){ myClassPtr ptr = new MyClass(); myClassSharedPtr sharedPtr1 = new MyClass(); ptr->greet(); { myClassSharedPtr sharedPtr2 = sharedPtr1; } }
这里实现了一个简单的 SharedPtr 类模板,其中包含了引用计数 refCount。通过适当增加和减少引用计数,可以确保正确地共享资源并在不再需要时释放资源,确保资源在适当时机被释放。
#include <iostream> template <typename T> class Singleton { public: static T& getInstance() { static T instance; return instance; } }; //测试代码 class MySingleton { private: MySingleton() {} // Private constructor to prevent instantiation public: void doSomething() { std::cout << "Doing something in MySingleton" << std::endl; } }; void test() { MySingleton& singleton = Singleton<MySingleton>::getInstance(); singleton.doSomething(); }
Singleton 类模板使用了模板元编程技术,通过静态成员函数 getInstance 返回单例对象的引用。这样可以确保只有一个实例被创建,并且在程序的整个生命周期中保持活动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。