5

我创建了一个向量 A 并想使用以下方法复制到另一个类中的向量 B,这是正确的方法吗?向量 A 可能被破坏!我在谷歌搜索,但没有找到好的解决方案和有意义的解释。感谢大家

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,向量 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-10T05:08:46.457 回答
-2

更好的方法是迭代新向量和向量push_back的元素。

参见示例代码:std::vector::begin

于 2013-05-10T04:49:18.633 回答