我正在创建一个菜单类,目前管理控件如下:
// .h
class CTab
{
public:
...
CComboBox* AddCombo();
std::vector<CComboBox*> m_vecControls;
...
}
// .cpp
CComboBox* CTab::AddCombo()
{
auto *combo = new CComboBox();
m_vecControls.push_back(combo);
return combo;
}
我使用std ::指针向量来轻松迭代所有控件,当我渲染它们时。我在初始化组合框时也返回指向该对象的指针,以便我可以向其中添加项目,例如:
auto *comboAge = AddCombo();
comboAge->AddItem("0-15");
comboAge->AddItem("16-30");
comboAge->AddItem("30+");
这一切都很好,但我试图实现最新和最好的C ++ 11功能,我不知道采取哪种方法。控件的所有权属于选项卡,选项卡的所有权属于窗口。是否最好完全停止使用指针,只需创建一个
std::vector<CComboBox>
?然后我可以使用
m_vecControls.push_back(std::move(combo));
但是我不确定返回引用的最佳方法是什么,所以我可以添加项目。另一个选择是使用智能指针,然后我不必在CTab :: ~CTab()中手动删除对象。所以我的问题是:
是否最好停止使用指针,支持std :: move?如果是这样,我应该如何在AddCombo()中返回对创建对象的引用?
或者最好使用智能指针而不是原始指针?如果是这样,哪种类型?我认为它必须被共享,因为除了在AddCombo()中返回指针外,我还保留了它们的向量。
答案 0 :(得分:2)
使用vector< unique_ptr<CComboBox> >
是一项简单的更改,您无需记住delete
内容。这适用于拥有单一所有权的物品。如果您需要共享所有权,请使用shared_ptr.
如果使用vector<CComboBox>
选项,则需要确保CComboBox
支持正确复制或移动语义。还要考虑代码的任何其他部分是否存储指向组合框的指针。如果您需要对同一CComboBox存在两个不同的引用,那么这可能不是最好的方法。