首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C结构工厂函数与其对应的C++包装类构造函数合并

将C结构工厂函数与其对应的C++包装类构造函数合并
EN

Stack Overflow用户
提问于 2017-11-03 03:23:24
回答 1查看 91关注 0票数 0

考虑用下面的代码为C库编写一个C++包装器(T是其他类型):

代码语言:javascript
复制
typedef struct { /*fields*/ } S;

S* alloc_S(const T*);
void free_S(S*);

我想写一个继承自S的类class_S,这样对alloc_Sfree_S的调用就可以隐藏起来,这分别归功于class_S::class_S(const T*)class_S::~class_S() (消除了忘记调用free_S的风险)。

由于alloc_S已经为它返回的结构的所有字段分配和赋值,有没有一种优雅的方法来“围绕”该结构构建class_S对象的其余部分?

我的目标是避免开销(在时间和空间上)

代码语言:javascript
复制
class_S::class_S(const T* t)
{
    S* tmp = alloc_S(t);
    // deep-copy tmp into this
    free_S(tmp);
}

显然,我可以编写class_S来拥有S*成员并使用它,而不是继承S,但如果可能的话,我希望避免这种方法。

EN

回答 1

Stack Overflow用户

发布于 2017-11-04 16:07:47

这里有一种非标准的、令人困惑且不可维护的方法--注意特殊的构造语法

代码语言:javascript
复制
#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:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47083131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档