5

ベクター A を作成し、以下の方法で別のクラスのベクター B にコピーしたいのですが、正しい方法ですか? ベクトル A が破壊される可能性があります! Google で検索しましたが、適切な解決策と意味のある説明が見つかりませんでした。みんな、ありがとう

void  StateInit(vector<CButton*> listBtn) 
{ 
   _m_pListBtn = listBtn; 
 };
4

2 に答える 2

8

はい、いいえ、ベクトルを値で渡しています。

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; 
};
于 2013-05-10T05:08:46.457 に答える
-2

より良い方法は、新しいベクターとpush_back要素をベクターに反復することです。

コード例を参照してください: std::vector::begin

于 2013-05-10T04:49:18.633 に答える