Это зависит от того, что вы хотите делать с классом, но я бы предложил:
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
берет вектор по значению и перемещает его в закрытую переменную-член, это означает, что если вызывающий объект передает rvalue, то копирование не производится.
Если вам нужно получить весь вектор, у вас есть выбор. Если вектор не слишком велик, производительность не критична или вам все равно нужно сделать копию, тогда возврат по значению подойдет и будет моим первым выбором:
std::vector<double> getData() const { return data_; }
В противном случае возврат по ссылке:
const std::vector<double>& getData() const { return data_; }
std::vector<double>& getData() { return data_ }
Но имейте в виду, что это полностью нарушает инкапсуляцию, особенно неконстантную версию.
person
Chris Drew
schedule
11.05.2014
using MyClass = std::vector<double>;
- person Ryan Haining   schedule 12.05.2014std::vector<double>
, и ничего не говорит нам о том, чего вы пытаетесь достичь. Это затрудняет совет о лучшем способе. - person jrok   schedule 12.05.2014data()
должен бытьconst
, и у вас нет возможности установить размер вашего вектора. Как вы хотите создать этот класс? - person Chris Drew   schedule 12.05.2014