ベクター A を作成し、以下の方法で別のクラスのベクター B にコピーしたいのですが、正しい方法ですか? ベクトル A が破壊される可能性があります! Google で検索しましたが、適切な解決策と意味のある説明が見つかりませんでした。みんな、ありがとう
void StateInit(vector<CButton*> listBtn)
{
_m_pListBtn = listBtn;
};
はい、いいえ、ベクトルを値で渡しています。
void StateInit(vector<CButton*> listBtn)
{
_m_pListBtn = listBtn;
};
これは、listBtn がベクター A のコピーであることを意味します (ベクター A を StateInit のパラメーターとして渡されたものと呼んでいると仮定します)。ポインターのベクトルは、ポイントされたオブジェクトを削除しません。これは、現在どのように行うことができないためです (呼び出し、削除、削除[]、解放する必要がありますか?)。
ベクター A の要素の 1 つを (ベクターのポインターを使用して) 変更/削除すると、その要素はベクター B で変更されることに注意してください (同じ要素へのポインターであるため)。
これで何を意図しているのかわかりませんが、ベクター全体をコピーする場合は、オブジェクトのクローンメカニズムを実装してから、変換を使用してコピーする必要があります。
class cloneFunctor {
public:
T* operator() (T* a) {
return a->clone();
}
}
それからちょうど:
void StateInit(vector<CButton*> listBtn)
{
transform(listBtn.begin(), listBtn.end(), back_inserter(_m_pListBtn), cloneFunctor());
};
あなたの意図がそれを複製することではなく、ポインターを共有することである場合は、ベクトルをポインターまたは参照として渡す必要があります。
void StateInit(const vector<CButton*>& listBtn)
{
_m_pListBtn = listBtn;
};
より良い方法は、新しいベクターとpush_back
要素をベクターに反復することです。
コード例を参照してください: std::vector::begin