创建对象,添加指向vector的指针,然后返回它

时间:2015-03-28 01:37:18

标签: c++ pointers c++11 vector

我正在创建一个菜单类,目前管理控件如下:

// .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()中手动删除对象。所以我的问题是:

  1. 是否最好停止使用指针,支持std :: move?如果是这样,我应该如何在AddCombo()中返回对创建对象的引用?

  2. 或者最好使用智能指针而不是原始指针?如果是这样,哪种类型?我认为它必须被共享,因为除了在AddCombo()中返回指针外,我还保留了它们的向量。

1 个答案:

答案 0 :(得分:2)

使用vector< unique_ptr<CComboBox> >是一项简单的更改,您无需记住delete内容。这适用于拥有单一所有权的物品。如果您需要共享所有权,请使用shared_ptr.

如果使用vector<CComboBox>选项,则需要确保CComboBox支持正确复制或移动语义。还要考虑代码的任何其他部分是否存储指向组合框的指针。如果您需要对同一CComboBox存在两个不同的引用,那么这可能不是最好的方法。