访问c++类成员对象,但不允许覆盖它
Access C++ class member object, but do not allow to override it
我正在学习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
方法安全地访问所有矢量功能,但您将无法分配新的矢量实例。
您使用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
。记住,您可能需要在MyClass
的构造函数中实例化_vec
。
您可能想要考虑使用函数只公开您需要的功能:
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;
}
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么 c++11 不允许使用自动
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- 余数除法和不允许除以零 (c++) 时遇到问题
- C++从外部类继承的嵌套类;不允许使用不完整的类型
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 重写打印函数而不是覆盖基类
- 不允许在类定义之外重写
- 错误消息:不允许抽象类类型 "X" 的对象:纯虚拟"Y"没有覆盖器
- 如何在不终止主应用程序的情况下卸载 ActiveX 的 ocx 以允许覆盖 ocx?
- 访问c++类成员对象,但不允许覆盖它