在类中变异私有向量的最佳方式

lquia 发布于 2019-05-15 c++ 最后更新 2019-05-15 22:59 21 浏览

我有一个关于更好的编程习惯的问题。说,我有以下班级:

class MyClass {
public: 
    vector<double> data() { return data_; }
    void set_data(int index, double value) { data_[index] = value; }
private:
    vector<double> data_;
};
我有私有向量data_和accessor / mutator函数。公共data_的情况下使用operator=非常方便。不过,我需要将data_设为私有,并通过成员函数访问/变更它。但我不确定构建mutator函数的最佳方法。到目前为止,我所见过的最好的方法就是这个例子。有什么建议么?
已邀请:

eea

赞同来自:

这取决于你想要怎么做课程,但我建议:

double getAt(size_t index) const { return data_.at(index); }
void setAt(size_t index, double value) { data_.at(index) = value; }
这样做的好处是可以更改类的内部实现,例如使用不同的STL容器,而不需要更改接口。请注意,getter是const。 如果性能至关重要并且您信任调用者,那么您可以省略边界检查:
double getAt(size_t index) const { return data_[index]; }
void setAt(size_t index, double value) { data_[index] = value; }
但是能够设置整个向量并且你不介意暴露实现可能是有用的,在这种情况下你可能想要这样的东西:
void setData(std::vector<double> data) { data_ = std::move(data); }
请注意,setData按值获取向量并将其移动到私有成员变量中,这意味着如果调用者传递右值,则不会进行复制。 如果你需要获得整个向量,你可以选择。如果向量不是太大,性能并不重要,或者你需要制作副本然后按值返回很好,这将是我的第一选择:
std::vector<double> getData() const { return data_; }
否则以引用方式返回:
const std::vector<double>& getData() const { return data_; }
std::vector<double>& getData() { return data_ } 
但请注意,这完全打破了封装,特别是非const版本。

jculpa

赞同来自:

提供数据访问的最简单方法。

double& at(size_t index) { return data_[index]; }
double const& at(size_t index) const { return data_[index]; }