如何将带有自定义删除器的unique_ptr作为类成员?
如何将带有自定义删除器的unique_ptr作为类成员?
嘿,我来给你讲清楚怎么把带自定义删除器的unique_ptr当成类成员来用哈~
首先得明确:带自定义删除器的std::unique_ptr,它的类型是包含删除器类型的,所以不能像普通unique_ptr那样只写std::unique_ptr<GDBusConnection>,得把删除器的类型也带上才行。
就拿你给出的GDBusConnection和g_object_unref删除器的例子来说,咱们一步步来:
第一步:在类里声明成员变量
首先在类的私有部分(或者需要的访问权限里)声明这个unique_ptr成员,类型要包含删除器的类型。这里咱们可以用decltype(&g_object_unref)来自动推导删除器的函数指针类型,不用手动写复杂的函数指针声明:
#include <glib.h> #include <memory> class MyBusClass { private: // 声明带自定义删除器的unique_ptr成员 std::unique_ptr<GDBusConnection, decltype(&g_object_unref)> m_bus_conn;
第二步:初始化成员变量
因为带函数指针类型删除器的unique_ptr不能默认构造(它需要知道具体的删除器函数),所以咱们得在构造函数里初始化它。有两种灵活的方式:
方式一:直接初始化连接并绑定删除器
public: MyBusClass() { GError* error = nullptr; // 直接创建连接并绑定删除器赋值给成员 m_bus_conn = std::unique_ptr<GDBusConnection, decltype(&g_object_unref)>( g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error), &g_object_unref ); if (!m_bus_conn) { std::cerr << "Couldn't get bus: " << (error ? error->message : "Unknown error") << std::endl; if (error) g_error_free(error); } } };
方式二:先初始化空指针+删除器,再用reset赋值
这种方式适合需要先做一些前置检查,再创建连接的场景:
public: MyBusClass() : m_bus_conn(nullptr, &g_object_unref) { // 先初始化空指针和删除器 GError* error = nullptr; // 用reset设置实际的连接指针 m_bus_conn.reset(g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error)); if (!m_bus_conn) { std::cerr << "Couldn't get bus: " << (error ? error->message : "Unknown error") << std::endl; if (error) g_error_free(error); } } };
小技巧:用类型别名简化代码
如果觉得std::unique_ptr<GDBusConnection, decltype(&g_object_unref)>写起来太长,可以提前定义一个类型别名,后续复用更方便:
// 定义类型别名 using DBusConnectionPtr = std::unique_ptr<GDBusConnection, decltype(&g_object_unref)>; class MyBusClass { private: DBusConnectionPtr m_bus_conn; // ... 后续代码和上面一致 };
这样整个代码看起来清爽很多,不管是类内还是其他地方使用这个指针类型,直接用DBusConnectionPtr就行。
备注:内容来源于stack exchange,提问作者parsley72
相关产品推荐
相关产品推荐

