我創建矢量A和需要通過使用以下方法來複制到在另一個類中的矢量B,它是正確的方式?矢量A可能被破壞!我在谷歌搜索,但沒有找到好的解決方案和有意義的解釋。謝謝大家複製到矢量用C++ <pointer*>
void StateInit(vector<CButton*> listBtn)
{
_m_pListBtn = listBtn;
};
我創建矢量A和需要通過使用以下方法來複制到在另一個類中的矢量B,它是正確的方式?矢量A可能被破壞!我在谷歌搜索,但沒有找到好的解決方案和有意義的解釋。謝謝大家複製到矢量用C++ <pointer*>
void StateInit(vector<CButton*> listBtn)
{
_m_pListBtn = listBtn;
};
是的,沒有,你傳遞載體的價值:
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;
};
有意義的解釋,謝謝你的回答! – 2013-05-10 06:29:48
一個更好的方法是迭代新矢量和push_back
元素到你的矢量。
見示例代碼:std::vector::begin
是的,看起來是正確的......只要你記得兩個指針可以指向同一個對象。 – Beta 2013-05-10 04:18:45
更好地寫你的函數'void StateInit(const vector&listBtn)'。現在寫入的方式會將向量複製兩次,一次到'listBtn'並再次到'_m_pListBtn'。沒有意義。 –
john
2013-05-10 04:21:45
@john和Beta但是向量A將來能夠被銷燬,當我們在B中訪問時它會使null異常嗎?如果不是,我猜是因爲我們做'_m_pListBtn = listBtn;'它只將listBtn中的所有元素複製到_m_pListBtn,它不會將矢量A的指針複製到矢量B中我是一個C++中的新人,對於一些愚蠢的問題進行翻譯^^ – 2013-05-10 04:30:46