我想用C ++实现一个类,其目的是为C风格的对象实现RAII机制。
然后,我需要能够将此类的实例传递给所有接收上述C样式对象作为参数的C样式函数。我知道这应该通过<?php
$dbConn = mysqli_connect('localhost', 'michael', '17701788', 'autoservice');
if(!$dbConn) {
die("Failed to connect to database " . mysqli_connect_error());
}
?>
来解决,但我暂时不能使用unique_ptr
。无论如何,我想了解如何做到这一点,无论有更好的解决方案。
对于我必须重载哪些运算符以及其中一些运算符之间的差异,我有几个疑问。
下面是我所做的实现的代码示例。我特别想与运营商1和2混淆(有什么区别?)
我想知道我实现的代码是否涵盖了所有用例,我的意思是,C库可以使用该对象的所有场景。另外,我想了解运算符1和2之间的区别。
C++11
// Example: a C-style library called "clib" which use an object called "cobj":
struct cobj {
int n;
};
void clib_create_cobj(struct cobj **obj) {
*obj = (struct cobj*)malloc(sizeof(cobj));
(*obj)->n = 25;
}
void clib_release_cobj(struct cobj *obj) {
free(obj);
}
void clib_doSomething(struct cobj *obj) {
std::cout << obj->n << std::endl;
}
// My wrapper class for implementing RAII
class CobjWrapper {
public:
CobjWrapper(struct cobj *obj) : m_obj (obj) { }
~CobjWrapper() {
if(m_obj != NULL) {
clib_release_cobj(m_obj);
m_obj = NULL;
}
}
operator struct cobj* () const { // (1)
return m_obj;
}
struct cobj& operator * () { // (2)
return *m_obj;
}
struct cobj** operator & () { // (3)
return &m_obj;
}
struct cobj* operator->() { // (4)
return m_obj;
}
private:
struct cobj *m_obj;
};
上述来源可以在这里测试:
答案 0 :(得分:3)
以下是隐式演员
operator struct cobj* () const { // (1)
示例用法
CobjWrapper wrapper = /**/;
struct cobj* obj = wrapper;
而以下是一元operator *
struct cobj& operator * () { // (2)
示例用法
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;
};