0

我正在学习 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>要包含到其他类中要复杂得多。

但也许只能通过为内部对象定义自己的方法(=接口)来做到这一点。

4

3 回答 3

3

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

创建一个公开派生的小型模板类,通过将其设为私有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,但您将无法分配新的向量实例。

于 2013-05-03T17:44:12.570 回答
3

您可能需要考虑使用函数来仅公开您需要的功能:

class MyClass
{
public:
    void push_back(int value) { _vec.push_back(value); }
    size_t size() { return _vec.size(); }

private:
    vector<int> _vec;
};

int main()
{
    MyClass x;
    x.push_back(0);
    x.push_back(7);
    x.push_back(9);
    cout << x.size() << endl;

    return 0;
}

或者只是使用一个普通的向量。

于 2013-05-03T07:08:22.913 回答
3

private你如何使用标识符有点奇怪。您设置您的vector<int>asprivate然后创建一个公共方法,该方法可以直接访问该变量。

相反,您应该创建公共方法get()push_back()

class MyClass{
     private: vector<int> _vec;
     public: 
         vector<int> get(){ return _vec(); }
         void push_back(int x) { _vec.push_back(x); }
};

//this will work
MyClass x;
x.push_back(0);
x.push_back(7);
x.push_back(9);
cout<<x.get().size()<<endl;

现在没有办法直接修改private变量vector<int> _vec。请记住,您可能需要_vecMyClass的构造函数中进行实例化。

于 2013-05-03T07:03:27.650 回答