在C ++中实现匿名适配器实例

时间:2014-06-05 01:15:40

标签: c++ c++11

注意:我之前曾要求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 ++知识无法提供的其他解决方案?

1 个答案:

答案 0 :(得分:0)

您应该使用smart pointers

std::vector<std::shared_ptr<B>> v;
v.push_back(std::shared_ptr{new X{}});
...

当使用次数达到0时,将自动删除该对象。