gpt4 book ai didi

c++ - 在 C++ 中为 C 样式对象创建透明包装类

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:31 25 4
gpt4 key购买 nike

我想用 C++ 实现一个类,其目的是为 C 风格对象实现 RAII 机制。

然后,我需要能够将此类的一个实例传递给所有接收上述 C 风格对象作为参数的 C 风格函数。我知道这应该用 unique_ptr 来解决,但我现在不能使用 C++11。无论如何,我想了解应该如何制作,无论是否有更好的解决方案。

对于必须重载哪些运算符以及其中一些运算符之间的区别,我有几个疑问。

下面是我实现的代码示例。我特别混淆运算符 1 和 2(有什么区别?)

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

C 风格对象

// 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;
}

C++“透明”包装器

// 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;

};

主要方法

// The main method:

int main() {
struct cobj *obj = NULL;

clib_create_cobj(&obj);

CobjWrapper w(obj);
clib_doSomething(w);

return 0;
}

上面的源码可以在这里测试:

http://cpp.sh/8nue3

最佳答案

下面是一个隐式转换

operator struct cobj* () const {    // (1)

使用示例

CobjWrapper wrapper = /**/;

struct cobj* obj = wrapper;

而以下是一元运算符 *

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;
};

关于c++ - 在 C++ 中为 C 样式对象创建透明包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45670163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com