注意:我之前曾要求this question作为副本迅速关闭。这个新问题涉及实际设计,因此它不应该与该问题重复。
我有一个类B
,它接受类型为C *
的单个参数(一个抽象基类)。我控制B
的定义。
我有一个松散的对象集合(读取:其他类中的一堆成员变量),具有各种接口(其中一些我无法控制)。有些实现C
,有些则不实现。我写了一些扩展C
并提供必要功能的适配器。
现在我想构建一个B
个对象的实际集合。像这样:
vector<B> bvec;
bvec.emplace_back(&obj1.x); // obj.x implements C
bvec.emplace_back(new YCAdapter(&obj2.y)); // obj.y doesn't implement C
bvec.emplace_back(new ZCAdapter(&obj3.z)); // obj.z doesn't implement C
... // 5-10 more of these
通过在单个向量下收集这些不同的对象,我现在可以以一致的方式执行有用的操作。
但是,这段代码有明显的内存泄漏,因为适配器泄露了。这些是非常小的类,几乎没有任何功能,我不想保留这些适配器的列表,以便我可以在以后销毁它们。
在拥有和销毁适配器(但不是C基类)时,如何让B
能够保存指针或对C
个对象的引用?我是否应该使用另一个基类从C
s中解除CAdapter
?或者我应该使用某种形式的智能指针?或者我的有限C ++知识无法提供的其他解决方案?
答案 0 :(得分:0)
您应该使用smart pointers:
std::vector<std::shared_ptr<B>> v;
v.push_back(std::shared_ptr{new X{}});
...
当使用次数达到0时,将自动删除该对象。