gpt4 book ai didi

C++ 包装 C struct *and* and functions

转载 作者:太空狗 更新时间:2023-10-29 20:00:24 25 4
gpt4 key购买 nike

我正在尝试包装一个使用如下模式的 C 库:

Thing* x= new_thing_("blah");
Thing* tmp= thing_copy(x);
free_thing(tmp);
Other* y=get_other(x,7);
char* message=get_message(x,y);
free_thing(x);
free_other(y);

在 C++ 中,我希望能够做类似的事情

auto_ptr<CXXThing> x=new CXXThing("blah");
auto_ptr<CXXThing> tmp=new CXXThing(*x);
auto_ptr<CXXOther> y=x->get_other(7);
char* message = y->get_message();

显然,CXXOther 也包装了指向 CXXThing 的指针。所以我遇到的问题是基本上我只想将函数和成员“插入”到现有结构中(我认为这被称为“Mixin”想法)。

问题是如果我包含一个 Thing 作为 CXXThing 的一个元素,那么我不知道如何声明构造函数,如果我包含一个指向包装类的指针 ,那么我有一个额外的无用间接级别。

我应该如何包装它才能做到这一点? (“你想做的不是最好的/可能的......这是正确的方法”的回答也是可以接受的。)

最佳答案

您可以更直接地使用 RAII 习惯用法,而不是使用 auto_ptr。这是您可以执行此操作的一种方法:

包装ThingCXXThing 类:

class CXXThing
{
public:
// Acquire a Thing
explicit CXXThing(const char* str) : x(::new_thing_(str)) {}
// Copy a Thing
CXXThing(const CXXThing& rhs) : x(::thing_copy(rhs.x)) {}
// Copy-and-swap idiom
CXXThing& operator=(CXXThing rhs)
{
swap(*this, rhs);
return *this;
}
// Release a Thing
~CXXThing() { ::free_thing(x); }

friend void swap(CXXThing& lhs, CXXThing& rhs)
{
Thing* tmp = lhs.x;
lhs.x = rhs.x;
rhs.x = tmp;
}

private:
Thing* x;
friend class CXXOther;
};

包装OtherCXXOther类:

class CXXOther
{
public:
// Acquire an Other
explicit CXXOther(CXXThing& thing, int i) : y(::get_other(thing.x, i)) {}
// Release an Other
~CXXOther() { ::free_other(y); }
// Get a message
char* get_message(const CXXThing& x) { return ::get_message(x.x, y); }
private:
// Instaces of Other are not copyable.
CXXOther(const CXXOther& rhs);
CXXOther& operator=(const CXXOther& rhs);
Other* y;
};

使用上述类将您的 C 代码转换为 C++ 代码:

int main()
{
CXXThing x("blah");

{
CXXThing tmp = x;
} // tmp will go away here.

CXXOther y(x, 7);
char* msg = y.get_message(x);
return 0;
}

关于C++ 包装 C struct *and* and functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140822/

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