我对更好的编程习惯有疑问。说,我有以下课程:
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函数。在公共operator=
的情况下使用data_
非常方便。但是,我需要使data_
私有,并通过成员函数访问/变更它。但我不确定构建mutator函数的最佳方法。到目前为止,我最好的方法是示例中的那个。有什么建议吗?
答案 0 :(得分:0)
提供数据访问的最简单方法。
double& at(size_t index) { return data_[index]; }
double const& at(size_t index) const { return data_[index]; }
答案 1 :(得分:0)
这取决于你想要怎么做课,但我建议:
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版本。