在C+中创建透明包装器类+;对于C样式的对象 我想在C++中实现一个类,其目的是为C样式对象实现RAII机制。p>

在C+中创建透明包装器类+;对于C样式的对象 我想在C++中实现一个类,其目的是为C样式对象实现RAII机制。p>,c++,c,operator-overloading,raii,C++,C,Operator Overloading,Raii,然后,我需要能够将这个类的一个实例传递给所有接收上述C风格对象作为参数的C风格函数。我知道这应该用unique\u ptr解决,但我现在不能使用C++11。不管怎样,我想了解应该如何做到这一点,不管有更好的解决方案 对于哪些操作符必须重载,以及其中一些操作符之间的差异,我有一些疑问 下面是我所做的实现的代码示例。我特别困惑于运算符1和运算符2(有什么区别?) 我想知道我实现的代码是否涵盖了所有用例,我的意思是,C库可以使用对象的所有场景。此外,我想了解运算符1和运算符2之间的区别 C样式对象 主

然后,我需要能够将这个类的一个实例传递给所有接收上述C风格对象作为参数的C风格函数。我知道这应该用
unique\u ptr
解决,但我现在不能使用
C++11
。不管怎样,我想了解应该如何做到这一点,不管有更好的解决方案

对于哪些操作符必须重载,以及其中一些操作符之间的差异,我有一些疑问

下面是我所做的实现的代码示例。我特别困惑于运算符1和运算符2(有什么区别?)

我想知道我实现的代码是否涵盖了所有用例,我的意思是,C库可以使用对象的所有场景。此外,我想了解运算符1和运算符2之间的区别

C样式对象 主要方法 可在此处测试上述来源:

以下是隐式强制转换

举例说明用法

CobjWrapper wrapper = /**/;

struct cobj* obj = wrapper;
CobjWrapper wrapper = /**/;

struct cobj& obj = *wrapper;
而以下是一元
运算符*

struct cobj& operator * () {        // (2)
举例说明用法

CobjWrapper wrapper = /**/;

struct cobj* obj = wrapper;
CobjWrapper wrapper = /**/;

struct cobj& obj = *wrapper;
顺便说一句,我会完全隐藏C结构,类似于:

class CobjWrapper {

    struct ObjDeleter
    {
        void operator()(cobj *obj) const { clib_release_cobj(obj); }
    };

    public:
        CobjWrapper()
        {
             cobj *obj = nullptr;
             clib_create_cobj(&obj);
             m_obj.reset(obj);
        }

        void doSomething() { clib_doSomething(m_obj.get()); }

    private:
        std::unique_ptr<cobj, ObjDeleter> m_obj;
};
类CobjWrapper{
结构对象
{
void操作符()(cobj*obj)常量{clib_release_cobj(obj);}
};
公众:
CobjWrapper()
{
cobj*obj=nullptr;
clib_create_cobj(&obj);
m_obj.重置(obj);
}
void doSomething(){clib_doSomething(m_obj.get());}
私人:
std::唯一的_ptrm_obj;
};

您能提出一个明确的问题吗?你想知道(1)和(2)之间的区别吗?现在,你不是在问什么,只是说你不知道的。如果你要实现RAII,你应该知道3/5/0的规则是什么。无论如何,已经有了带有自定义删除程序的
std::unique_ptr
。仅供参考:C++98使用了
std::auto_ptr
而不是
std::unique_ptr
CobjWrapper wrapper = /**/;

struct cobj& obj = *wrapper;
class CobjWrapper {

    struct ObjDeleter
    {
        void operator()(cobj *obj) const { clib_release_cobj(obj); }
    };

    public:
        CobjWrapper()
        {
             cobj *obj = nullptr;
             clib_create_cobj(&obj);
             m_obj.reset(obj);
        }

        void doSomething() { clib_doSomething(m_obj.get()); }

    private:
        std::unique_ptr<cobj, ObjDeleter> m_obj;
};