2013-05-10 51 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