Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
去年关闭。
我正在为C-API编写包装器。
(i)令
(ii)这样的数组可以由用户使用
我想创建一个包装器类,将其命名为
(a)具有一个可以使用API返回的
(b)具有名为
(c)对于(i)最好具有语法
对于(a),可能会引起混乱,因为一个班级要做两件事,这打破了单一责任原则。回答“复制构造函数是否进行浅层复制?”之类的问题。不会很明显,需要进一步的文档。
(b)似乎是一个不错的选择,但现在有多种情况:
(c)是最佳的,并且与其他类一起使用似乎很自然,但是我不知道使它起作用的方法。我可以在
然后,一个简单的包装器可能看起来像这样:
使用共享指针,您可以选择a)清理操作和b)复制
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
去年关闭。
我正在为C-API编写包装器。
(i)令
capi_array_data capi_get_array(void)
为包含在该库中的函数,该函数返回包含有关由所述API管理的堆分配数组的元数据的结构。看起来像struct capi_get_array { size_t length; int* arr };
(为简单起见,使用int
)(ii)这样的数组可以由用户使用
malloc
,new
,std::vector
等手动创建。然后必须在void capi_register_array(int*)
中注册。我想创建一个包装器类,将其命名为
MyArrayWrapper
,使用STL容器的解剖结构管理此类数组,支持operator[]
,begin
,back
等。在(i)中,该包装器将不拥有数据,但在(ii)中会。我现在的问题是,我是否应该(a)具有一个可以使用API返回的
std::initializer_list
(或该主题的可变参数模板)或int*
构造的单个类;(b)具有名为
MyArrayWrapperRef
和MyArrayWrapper
之类的单独的类,第一个处理(i)和第二个处理(ii);(c)对于(i)最好具有语法
MyArrayWrapper&
,对于(ii)最好具有MyArrayWrapper
语法;能做到吗?对于(a),可能会引起混乱,因为一个班级要做两件事,这打破了单一责任原则。回答“复制构造函数是否进行浅层复制?”之类的问题。不会很明显,需要进一步的文档。
(b)似乎是一个不错的选择,但现在有多种情况:
MyArrayWrapper
,MyArrayWrapper&
,MyArrayWrapperRef
,MyArrayWrapperRef&
。它们有何不同?那const
引用呢?这甚至可能需要另一个类MyArrayWrapperConstRef
,并再次导致混乱。(c)是最佳的,并且与其他类一起使用似乎很自然,但是我不知道使它起作用的方法。我可以在
capi_get_array
周围做一个包装,返回一个MyArrayWrapperRef
,但是我必须将引用源保存在某个地方,对吗? 最佳答案
(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)复制
wrapper
时发生的事情而不会引起很大的混乱;)。10-05 23:44