gpt4 book ai didi

c++ - 自定义引用类型

转载 作者:行者123 更新时间:2023-11-28 04:31:28 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

3年前关闭。




Improve this question




我正在围绕 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) 有一个可以使用std::initializer_list 来构造的类。 (或可变参数模板)或 int*由 API 返回;

(b) 有单独的类,命名为 MyArrayWrapperRefMyArrayWrapper ,第一次处理(i)和第二次处理(ii);

(c) 最好有语法MyArrayWrapper&对于 (i) 和 MyArrayWrapper (ii);可以这样做吗?

使用 (a) 可能会造成混淆,因为一个类(class)会做两件事,这违反了单一责任原则。回答诸如“复制构造函数是否进行深度浅复制?”之类的问题。不会很明显,需要进一步的文件。

(b) 似乎是一个不错的选择,但现在有多种情况:MyArrayWrapper , MyArrayWrapper& , MyArrayWrapperRef , MyArrayWrapperRef& .他们会有什么不同? const 呢?引用?这甚至可能需要另一个类 MyArrayWrapperConstRef并再次导致困惑。

(c) 是最佳的,并且在其他类中看起来很自然,但我不知道如何让它发挥作用。我可以在 capi_get_array 周围做一个包装返回 MyArrayWrapperRef ,但我必须将引用的来源保存在某处,对吗?

最佳答案

With (a) there could come up confusion, as one class does two things, which breaks the single-responsibility principle.



你也可以反过来看:包装器的单一职责 隐藏真正的所有权以及谁清理了什么。

假设你有这个:
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 时会发生什么不会造成很大的困惑;)。

关于c++ - 自定义引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52785384/

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