C ++ - Добавление элементов в приватное поле члена std :: vector [duplicate]

0
class T {
private:
  std::vector<T> myVec;
  // ...
public:
  T();
  T(float x, float y);
  std::vector<T> getMyVec() { return myVec; }
  // ...
};

//в T.cpp Я не использую myVec каким-либо образом (не в конструкторе)

//в Tmain.cpp:

int main() {
  T myT;
  std::cout << myT.getMyVec().size() << std::endl; // 0
  T anotherT(1.1, 2.2);
  myT.getMyVec().push_back(anotherT);
  std::cout << myT.getMyVec().size() << std::endl; // 0
}

Надеюсь, я могу пояснить (просто предположим, что мой #include и т.д. Верен):

Таким образом, в основном у меня есть класс T, в котором у меня есть поле частного члена с именем myVec, которое имеет тип std :: vector. У меня также есть функция public (get-) для доступа к этому полю. В основном я создаю себе объект T и распечатаю его myVec.size(). Это нуль, поскольку я еще ничего не сделал с вектором. Я создаю объект anotherT и push_back() в мое векторное поле предыдущего объекта T. Опять же, я распечатываю myVec.size() первого объекта (я ожидаю, что на данный момент он будет равен 1, так как я добавил ему другое. Но он по-прежнему возвращает 0 в качестве своего размера. Почему это? Я делаю так, что он "сохраняет" объекты, которые я пытаюсь добавить к нему?

  • 3
    Подсказка 1): ваш получатель возвращает копию. Подсказка 2) если вы хотите выставить закрытого участника так, чтобы его можно было записать, вы также можете сделать его публичным. Подсказка 3) Возможно, вам нужен метод void add_element(float x); это добавляет элемент к вашему личному вектору.
  • 0
    Подсказка 3): Читайте о ссылках на C ++. Вы разрушаете инкапсуляцию с этим, хотя и делаете члена публичным практически одинаковым.
Показать ещё 4 комментария
Теги:
vector
field
size
push-back

2 ответа

1
Лучший ответ
std::vector<T> getMyVec() { return myVec; }

должно быть

std::vector<T>& getMyVec() { return myVec; }

иначе вы вернете копию своего члена.

0

Вам нужно вернуть ссылку на свой частный вектор.

std::vector<T>& getMyVec() { return myVec; }

Иначе он вернет копию. И любые изменения, внесенные вами в копию, не повлияют на ваш вектор в классе.

  • 0
    А? За что проголосовали?
  • 0
    Возможно, потому что первая версия была неправильной, а вторая версия ничего не добавляет к другому ответу.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню