私のクラスにはポインタベクトルがあります:
ptr_vector<Class> vec;
そして、いくつかの「セットアップ」メソッドでは、ベクターにいくつかのクラスを追加します。
void setupOrSomething()
{
vec.push_back(new Class(...));
....
}
これで、このクラスのクライアントは、クラスオブジェクトをこのクラスリストに追加したいと思うかもしれません。
void addThingToMyList(Class *cPointer)
{
vec.push_back(cPointer);
}
そして、彼らは同じポインタを渡すことによってそれらを削除したいと思うかもしれません:
void removeThingFromMyList(Class *cPointer) { ... }
正しく理解できれば、この回答(https://stackoverflow.com/a/357043/48998)を読んだ後、次のようにそのメソッドを実装する必要があります。
void removeThingFromMyList(Class *cPointer)
{
vec.release(std::find_if(vec.begin(),vec.end(),CheckPointerValue(cPointer)).release();
}
struct CheckPointerValue
{
CheckPointerValue(Class* c):cptr(c) {}
bool operator()(Class const& X) { return &X == cptr;}
private:
Class* cptr;
};
また、ptr_vector.release()から返されるauto_ptrでrelease()をもう一度呼び出す必要があることを理解しています。
これにより、このメソッドの呼び出し元(RemoveThing ...)がそのClassオブジェクトへの有効な参照を保持し、削除されないことが保証されると想定して正しいですか?私は単にvecに一時的な所有権を取得してからそれを放棄したいだけです。