阅读量:0
在C++中,句柄类(Handle class)通常用于封装对资源(如文件、网络连接、内存等)的引用。为了实现封装,我们需要确保对资源的访问是安全和可控的。以下是一个简单的句柄类示例,展示了如何实现封装:
#include <iostream> #include <memory> // 资源基类 class Resource { public: virtual ~Resource() = default; virtual void use() = 0; }; // 具体资源类 class ConcreteResource : public Resource { public: void use() override { std::cout << "Using the resource." << std::endl; } }; // 句柄类 class Handle { public: // 构造函数,接受一个指向资源的指针 explicit Handle(Resource* resource) : resource_(resource) {} // 析构函数,释放资源 ~Handle() { delete resource_; } // 禁止拷贝构造和拷贝赋值 Handle(const Handle&) = delete; Handle& operator=(const Handle&) = delete; // 移动构造和移动赋值 Handle(Handle&& other) noexcept : resource_(other.resource_) { other.resource_ = nullptr; } Handle& operator=(Handle&& other) noexcept { if (this != &other) { delete resource_; resource_ = other.resource_; other.resource_ = nullptr; } return *this; } // 使用资源 void use() const { if (resource_) { resource_->use(); } else { std::cout << "Resource is not available." << std::endl; } } private: Resource* resource_; }; int main() { // 创建一个具体资源 ConcreteResource* resource = new ConcreteResource(); // 使用句柄类封装资源 Handle handle(resource); handle.use(); // 句柄类负责管理资源的生命周期,确保资源被正确释放 return 0; }
关键点解释:
资源基类和具体资源类:定义了一个资源基类
Resource
和一个具体资源类ConcreteResource
。具体资源类实现了资源的使用方法。句柄类:
- 构造函数:接受一个指向资源的指针,并将其存储在成员变量
resource_
中。 - 析构函数:释放资源指针指向的资源。
- 禁止拷贝构造和拷贝赋值:确保句柄类的实例不能被拷贝,从而避免多个句柄类实例共享同一个资源。
- 移动构造和移动赋值:允许句柄类的实例被移动,而不是拷贝,从而提高效率。
- 使用资源:提供一个方法
use
来访问资源。如果资源指针为空,则输出提示信息。
- 构造函数:接受一个指向资源的指针,并将其存储在成员变量
通过这种方式,句柄类实现了对资源的封装,确保了资源的安全管理和正确使用。