自定义参考类型

发布自我

我正在为C-API编写包装器。

(i)让capi_array_data capi_get_array(void)该库中包含的函数返回一个结构,该结构包含有关由所述API管理的堆分配数组的元数据。看起来像struct capi_get_array { size_t length; int* arr };int为简单起见使用

(ⅱ)这样的阵列可以通过手动与用户创建mallocnewstd::vector等。然后必须注册void capi_register_array(int*)

我想打一个包装类,调用它MyArrayWrapper,管理这样一个阵列,STL容器的解剖结构,支持operator[]beginback,等。在(i)本包装就没有自己的数据,但在(ii)其会。我现在的问题是,我是否应该

(a)具有一个单一类,可以使用std::initializer_list(或针对该问题的可变参数模板)或int*API返回的类来构造该类

(b)有单独的类,其名称类似于MyArrayWrapperRefMyArrayWrapper,第一个处理(i)和第二个处理(ii);

(c)最佳地具有MyArrayWrapper&(i)和MyArrayWrapper(ii)的语法可以做到吗?

对于(a),可能会引起混乱,因为一个班级要做两件事,这打破了单一责任原则。回答“复制构造函数是否进行浅层复制?”之类的问题。不会很明显,需要进一步的文档。

(二)似乎是一个不错的选择,但现在有多种情况:MyArrayWrapperMyArrayWrapper&MyArrayWrapperRefMyArrayWrapperRef&它们有何不同?const参考呢?这甚至可能需要另一堂课,MyArrayWrapperConstRef并再次导致混乱。

(c)是最佳的,并且与其他类一起使用似乎很自然,但是我不知道使它起作用的方法。我可以对capi_get_array返回进行包装MyArrayWrapperRef,但是我必须将引用源保存在某个地方,对吗?

idclev 463035818

对于(a),可能会引起混乱,因为一个班级要做两件事,这打破了单一责任原则。

您也可以反过来查看它:包装程序的唯一职责隐藏真实所有权以及谁来清理内容。

可以说你有这个:

struct arr_data {
    int* a;
    unsigned size;
};
arr_data get_arr(){
    arr_data ret;
    ret.size = 5;
    ret.a = new int[ret.size];
    return ret;
}
void reg_arr(arr_data x){
    static arr_data store = x;
}

然后,一个简单的包装可能看起来像这样:

struct wrapper {
    std::shared_ptr<arr_data> data;
    // implement container-like interface
};

wrapper make_non_owning_wrapper() { 
    auto res = new arr_data();
    *res = get_arr();
    return { std::shared_ptr<arr_data>(res,[](arr_data* x){
            std::cout << "delete x only\n";
            delete x;
    }) };
}

wrapper make_owning_wrapper() {
    auto res = new arr_data();
    res->size = 5;
    res->a = new int[res->size];
    return { std::shared_ptr<arr_data>(res,[](arr_data* x){
        std::cout << "delete both\n";
        delete[] x->a;
        delete x;
    })};
}

int main(){
    auto v = make_owning_wrapper();
    auto w = make_non_owning_wrapper();
    auto z = v;
}

使用共享的指针,您可以选择a)清理操作和b)复制a时会发生什么wrapper而不会引起很大的混乱;)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章