考虑用下面的代码为C库编写一个C++包装器(T是其他类型):
typedef struct { /*fields*/ } S;
S* alloc_S(const T*);
void free_S(S*);我想写一个继承自S的类class_S,这样对alloc_S和free_S的调用就可以隐藏起来,这分别归功于class_S::class_S(const T*)和class_S::~class_S() (消除了忘记调用free_S的风险)。
由于alloc_S已经为它返回的结构的所有字段分配和赋值,有没有一种优雅的方法来“围绕”该结构构建class_S对象的其余部分?
我的目标是避免开销(在时间和空间上)
class_S::class_S(const T* t)
{
S* tmp = alloc_S(t);
// deep-copy tmp into this
free_S(tmp);
}显然,我可以编写class_S来拥有S*成员并使用它,而不是继承S,但如果可能的话,我希望避免这种方法。
发布于 2017-11-04 16:07:47
这里有一种非标准的、令人困惑且不可维护的方法--注意特殊的构造语法
#include <memory>
extern "C" {
struct T {};
struct S
{
};
S* alloc_S(T*);
void free_S(S*);
}
struct class_S : S
{
void * operator new (std::size_t, T* p)
{
return alloc_S(p);
}
void operator delete(void *p)
{
if (p) free_S(reinterpret_cast<S*>(p));
}
};
int main()
{
T t;
auto ps = new (&t) class_S;
delete ps;
}总的来说,你最好使用带有自定义删除器的unique_ptr:
struct class_S
{
struct deleter {
void operator()(S*p) const noexcept {
free_S(p);
}
};
class_S(T* p) : impl_(alloc_S(p), deleter()) {}
// add proxy methods as required
std::unique_ptr<S, deleter> impl_;
};
int main()
{
T t;
auto mys = class_S(&t);
}https://stackoverflow.com/questions/47083131
复制相似问题