C++ 代码分析:VirtualKeyboard 类单例模式实现
这段代码定义了一个名为 VirtualKeyboard 的类,该类使用单例模式实现,保证只有一个 VirtualKeyboard 对象实例。
std::unique_ptr<VirtualKeyboard> VirtualKeyboard::instance_ = nullptr;
// 定义静态成员变量 instance_,使用 std::unique_ptr 指向唯一的 VirtualKeyboard 对象,初始值为 nullptr
VirtualKeyboard *VirtualKeyboard::GetInstance()
// 定义静态成员函数 GetInstance(),用于获取 VirtualKeyboard 的唯一实例
{
if (!instance_) {
std::string node;
if (VirtualDevice::FindDeviceNode(VirtualKeyboardBuilder::GetDeviceName(), node)) {
auto vKeyboard = std::make_unique<VirtualKeyboard>(node);
// 使用 std::make_unique 创建 VirtualKeyboard 对象
if (vKeyboard->IsActive()) {
// 检查 VirtualKeyboard 对象是否已激活
instance_ = std::move(vKeyboard);
// 将新创建的 VirtualKeyboard 对象移动到 instance_,保证唯一性
}
}
}
return instance_.get();
// 返回 instance_ 指向的 VirtualKeyboard 对象的指针
}
代码解释:
std::unique_ptr<VirtualKeyboard> VirtualKeyboard::instance_ = nullptr;- 定义了一个静态成员变量
instance_,使用std::unique_ptr指向唯一的VirtualKeyboard对象。 nullptr表示初始状态下没有创建VirtualKeyboard对象。
- 定义了一个静态成员变量
VirtualKeyboard *VirtualKeyboard::GetInstance()- 定义了一个静态成员函数
GetInstance(),用于获取VirtualKeyboard的唯一实例。
- 定义了一个静态成员函数
if (!instance_)- 判断
instance_是否为空,如果为空,则表示还没有创建VirtualKeyboard对象,需要进行创建。
- 判断
std::string node;- 定义一个字符串变量
node,用于存储设备节点信息。
- 定义一个字符串变量
if (VirtualDevice::FindDeviceNode(VirtualKeyboardBuilder::GetDeviceName(), node))- 调用
VirtualDevice::FindDeviceNode函数查找VirtualKeyboard设备节点,如果找到则将节点信息存储到node变量中。
- 调用
auto vKeyboard = std::make_unique<VirtualKeyboard>(node);- 使用
std::make_unique创建一个VirtualKeyboard对象,并将设备节点信息node传递给构造函数。
- 使用
if (vKeyboard->IsActive())- 检查新创建的
VirtualKeyboard对象是否已激活。
- 检查新创建的
instance_ = std::move(vKeyboard);- 将新创建的
VirtualKeyboard对象移动到instance_,保证instance_一直指向唯一的VirtualKeyboard对象。
- 将新创建的
return instance_.get();- 返回
instance_指向的VirtualKeyboard对象的指针。
- 返回
总结:
这段代码通过 std::unique_ptr 和单例模式实现了 VirtualKeyboard 类的唯一实例管理。通过 GetInstance() 函数,可以获取 VirtualKeyboard 对象的唯一实例,并确保在程序运行期间只有一个 VirtualKeyboard 对象存在。
原文地址: https://www.cveoy.top/t/topic/nPz2 著作权归作者所有。请勿转载和采集!