我正在学习C ++,我只是遇到一个小问题。我有一个包含vector<int>
的类。从外部vector<int>
应该是可访问的,因此应该可以添加/删除/获取其元素。
不应该使用新实例覆盖对象。 这是一个这样的示例类(它是最小化的):
class MyClass
{
public:
vector<int>& vec() { return _vec; }
private:
vector<int> _vec;
};
E.g。以下代码有效:
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> *
的指针的解决方案。但我学会指针是'邪恶',我不应该直接使用它们,我必须使用智能指针。我认为对于这个问题,智能指针是没用的,所以我不知道如何解决这个简单的问题: - /
或者只是一个简单的指针是最干净的解决方案?
最好的问候
凯文
-edit -
一般来说,我喜欢制作可以像下面的C#类一样使用的东西:
public class MyClass
{
public List<int> List { get; private set; }
public MyClass()
{
List = new List<int>();
}
}
这只是一个例子,我只想到了如何在C ++中实现这一点。也许在某些情况下,我有比vector<int>
/ List<int>
更复杂的类,以包含在其他类中。
但也许只有通过为内部对象定义自己的方法(= interface)才能做到这一点。
答案 0 :(得分:3)
使用private
标识符有点奇怪。
您将vector<int>
设置为private
,然后创建一个可以直接访问该变量的公共方法。
您应该创建公共方法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
。
请记住,您可能需要在_vec
的构造函数中实例化MyClass
。
答案 1 :(得分: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;
}
或者只是使用普通矢量。
答案 2 :(得分:3)
我认为唯一可接受的解决方案是为vector类中的所有方法提供转发函数似乎是错误的。所以我想提出一个替代答案。
创建一个公开派生自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
方法安全地访问所有矢量功能,但您将无法分配新的矢量实例。