在C+中创建透明包装器类+;对于C样式的对象 我想在C++中实现一个类,其目的是为C样式对象实现RAII机制。p>
然后,我需要能够将这个类的一个实例传递给所有接收上述C风格对象作为参数的C风格函数。我知道这应该用在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样式对象 主
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;
};