我有以下数据类型:
class A{
public:
A(){
}
~A(){
for(size_t i=0; i<b_elements.size(); i++)
delete b_elements[i];
b_elements.clear();
}
vector<B*> b_elements;
//other operations ...
};
实施访问者设计模式以对A
进行一些计算。
当我想仅处理b_elements
的子集并将访问者专门应用于这些元素时,问题就开始了。
一种解决方案是创建另一个A
对象,其b_elements
指向原始对象中的所需元素,并在新创建的对象上调用访问者。但是(正如您所期望的)问题是当新对象被销毁时,析构函数将删除那些将影响原始对象作为副作用的引用。
提示:我无法使用所需的b_elements
从原始对象创建副本,因为它太贵了。
我的问题是,这是一种常见的模式吗?什么是避免这种问题的最佳做法?
答案 0 :(得分:2)
存储共享指针的向量:
class A{
public:
A(){
}
vector<std::shared_ptr<B>> b_elements;
//other operations ...
};
答案 1 :(得分:1)
或矢量的共享指针
class A{
public:
A(){
}
std::shared_ptr< std::vector<B*> > b_elements;
//other operations ...
};
使用这种方法,只有矢量将在末尾被销毁,而不是它的元素。