改变类中私有向量的最佳方法

时间:2014-05-11 21:22:07

标签: c++ class private mutators

我对更好的编程习惯有疑问。说,我有以下课程:

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函数的最佳方法。到目前为止,我最好的方法是示例中的那个。有什么建议吗?

2 个答案:

答案 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版本。