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問題は、サブセットのみで作業し、特にそれらの要素にビジターを適用したいときに始まります。

1 つの解決策は、元のオブジェクト内の目的の要素を指し、新しく作成されたオブジェクトでビジターを呼び出す別のオブジェクトを作成するAことb_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 に答える