【发布时间】:2017-11-27 20:57:41
【问题描述】:
我正在设计一个有两个标准向量作为成员的类。我希望能够在向量元素上使用基于范围的 for 循环,我想出了这个解决方案
#include <iostream>
#include <vector>
using namespace std;
class MyClass {
public:
void addValue1(int val){data1_.push_back(val);}
void addValue2(int val){data2_.push_back(val);}
vector<int> const & data1() const {return data1_;}
vector<int> const & data2() const {return data2_;}
// ...
private:
vector<int> data1_;
vector<int> data2_;
// ...
};
void print1(MyClass const & mc) {
for (auto val : mc.data1()){
cout << val << endl;
}
}
void print2(MyClass const & mc) {
for (auto val : mc.data2()){
cout << val << endl;
}
}
int main(){
MyClass mc;
mc.addValue1(1);
mc.addValue1(2);
mc.addValue1(3);
print1(mc);
}
显然,定义 begin() 和 end() 函数的替代方法没有意义,因为我有两个不同的向量。
我想问以下问题:
建议的解决方案的一个缺点是不能更改两个向量的内容(由于
const限定符)。如果我需要修改矢量元素,我该如何修改代码? 编辑:修改应保留封装考虑到数据封装,您认为返回两个向量的 (
const) 引用是不好的做法吗?
【问题讨论】:
-
“修改向量的内容”根据定义是取消封装它们。这就是封装。因此,简单的答案变成:
struct MyClass { vector<int> data1; vector<int> data2; } -
@Caleth :在我的问题中,我写道我希望能够更改向量元素的值,但我不想提供添加和删除元素的能力。据我了解,封装要求只能对数据执行某些安全操作(即我的应用程序写入和读取元素值),而其他操作是隐藏的(即我的应用程序添加和删除数据)。
-
哦,在这种情况下,您肯定想要@Yakk 的解决方案。在 MyClass 的公共成员中不提及
vector是“更加封装”
标签: c++ c++11 containers c++14 encapsulation