2013-05-10 89 views
3

我創建矢量A和需要通過使用以下方法來複制到在另一個類中的矢量B,它是正確的方式?矢量A可能被破壞!我在谷歌搜索,但沒有找到好的解決方案和有意義的解釋。謝謝大家複製到矢量用C++ <pointer*>

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

是的,看起來是正確的......只要你記得兩個指針可以指向同一個對象。 – Beta 2013-05-10 04:18:45

+0

更好地寫你的函數'void StateInit(const vector &listBtn)'。現在寫入的方式會將向量複製兩次,一次到'listBtn'並再次到'_m_pListBtn'。沒有意義。 – john 2013-05-10 04:21:45

+0

@john和Beta但是向量A將來能夠被銷燬,當我們在B中訪問時它會使null異常嗎?如果不是,我猜是因爲我們做'_m_pListBtn = listBtn;'它只將listBtn中的所有元素複製到_m_pListBtn,它不會將矢量A的指針複製到矢量B中我是一個C++中的新人,對於一些愚蠢的問題進行翻譯^^ – 2013-05-10 04:30:46

回答

4

是的,沒有,你傳遞載體的價值:

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

至極意味着listBtn是矢量A的副本(asuming我們呼籲矢量A的一個作爲StateInit的參數傳遞),如果刪除向量A,向量B仍然會有指針集合,並且它們將是有效的,因爲銷燬指向向量不會刪除指向的對象,因爲它現在不可能如何呼叫,刪除,刪除[],免費?)。請記住,如果您修改/刪除向量A中的一個元素(使用向量上的指針),那麼該元素將在向量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; 
}; 
+0

有意義的解釋,謝謝你的回答! – 2013-05-10 06:29:48