1

我有以下数据类型:

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并将访问者专门应用于这些元素时,问题就开始了。

一种解决方案是创建另一个对象,Ab_elements指向原始对象中的所需元素,并在新创建的对象上调用访问者。但是(如您所料)问题是当新对象被销毁时,析构函数将删除那些会影响原始对象的引用作为副作用。

提示:我无法从原始对象创建所需的副本,b_elements因为它太昂贵了。

我的问题是,这是一种常见的模式吗?避免此类问题的最佳做法是什么?

4

2 回答 2

2

共享指针的存储向量:

class A{
public:
    A(){
    }
    vector<std::shared_ptr<B>> b_elements;
    //other operations ...
};
于 2012-07-27T06:59:56.600 回答
1

或向量的共享指针

class A{
public:
    A(){
    }
    std::shared_ptr< std::vector<B*> > b_elements;
    //other operations ...
};

使用这种方法,最后只会销毁向量,而不是元素。

于 2012-07-27T07:12:35.213 回答