1

我有一个关于更好的编程实践的问题。说,我有以下课程:

class MyClass {
public: 
    vector<double> data() { return data_; }
    void set_data(int index, double value) { data_[index] = value; }
private:
    vector<double> data_;
};

我有私有向量data_和访问器/修改器函数。operator=在公共场合使用data_非常方便。但是,我需要将其设为data_私有并通过成员函数对其进行访问/变异。但我不确定构造 mutator 函数的最佳方法。到目前为止,我最好的方法是示例中的方法。有什么建议么?

4

2 回答 2

0

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

double& at(size_t index) { return data_[index]; }
double const& at(size_t index) const { return data_[index]; }
于 2014-05-11T21:33:24.850 回答
0

这取决于你想在课堂上做什么,但我建议:

double getAt(size_t index) const { return data_.at(index); }
void setAt(size_t index, double value) { data_.at(index) = value; }

这样做的好处是您可以更改类的内部实现,例如使用不同的 STL 容器,并且您不需要更改接口。请注意,吸气剂是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_ } 

但请注意,这完全破坏了封装,尤其是非常量版本。

于 2014-05-11T22:15:34.487 回答