我正在学习C ++,但有一个小问题。我有一个包含vector<int>的类。从外部可以访问此vector<int>,因此应该可以添加/删除/获取其元素。

应该不可能用新的实例覆盖该对象。
这是一个示例类(已最小化):

class MyClass
{
    public:
        vector<int>& vec() { return _vec; }
    private:
        vector<int> _vec;
};


例如。以下代码有效:

MyClass x;
x.vec().push_back(0);
x.vec().push_back(7);
x.vec().push_back(9);
cout << c.vec().size() << endl;


但不幸的是,以下代码也可以使用:

MyClass x;
x.vec() = vector<int>();


我喜欢不允许这样做,但我只是找到了返回vector<int> *类型的指针的解决方案。但是我了解到指针是“邪恶的”,我不应该直接使用它们,我必须使用智能指针。我认为对于这个问题,智能指针是没有用的,所以我不知道如何解决这个简单的问题:-/

还是只是简单的指针是最干净的解决方案?

最好的祝福

凯文

-编辑-

总的来说,我喜欢做一些可以像下面的C#类那样使用的东西:

public class MyClass
{
    public List<int> List { get; private set; }

    public MyClass()
    {
        List = new List<int>();
    }
}


这只是一个例子,我只是想过如何在C ++中做到这一点。也许在某些情况下,我可以将比vector<int> / List<int>更复杂的类包含到其他类中。

但是也许只有通过定义内部对象自己的方法(= interface)才能做到这一点。

最佳答案

在我看来,唯一可接受的解决方案是为向量类中的所有方法提供转发功能。因此,我想提出一个替代答案。

创建一个从vector公开派生的小型模板类,该模板类通过将其私有化来隐藏operator=方法。

template<class T>
class immutablevector : public vector<T>
{
  private:
    immutablevector &operator=(vector<T>);
};


然后,在MyClass中,无论您在什么地方使用过vector,都应改用immutablevector

class MyClass
{
  public:
    immutablevector<int>& vec() { return _vec; }
  private:
    immutablevector<int> _vec;
};


现在,您可以通过vec方法安全地访问所有矢量功能,但是您将无法分配新的矢量实例。

10-02 03:35
查看更多