Как я могу изменить вектор вне класса - PullRequest
0 голосов
/ 13 апреля 2019

Как я могу получить доступ к закрытому вектору вне класса? Я хочу изменить параметры этого объекта.

Я пытаюсь сделать getter и вернуть вектор по ссылке, но когда я пытаюсь изменить параметры объектов, включенных в вектор в основных функциях, изменения в векторе не сохраняются.

class Restaurant
{
    std::vector <Waiter> waiters_vector_;

public:
     inline std::vector<Waiter> &GetWaitersVector() { return waiters_vector_; }      

     void Restaurant::AddWaiter(Waiter tmp)
{
          waiters_vector_.push_back(tmp);
}
     Restaurant();
    ~Restaurant();
};


class Waiter
{
    int current_group_id_=0;
public:
    int GetCurrentGroupId()
{
    return current_group_id_;
}

void SetCurrentGroupId(int tmp)

{
    current_group_id_ = tmp;
}

    Waiter();
    ~Waiter();
};


int main()
{  

    Restaurant restaurant1;
    Waiter w1, w2, w3;
    restaurant1.AddWaiter(w1);
    restaurant1.AddWaiter(w2);
    restaurant1.AddWaiter(w3);

    for (Waiter element : restaurant1.GetWaitersVector())
{
        element.SetCurrentGroupId(123);
}

    for (Waiter element : restaurant1.GetWaitersVector())
{
        std::cout << element.GetCurrentGroupId() << std::endl;
}

}

Результат: 0 0 0

Ответы [ 3 ]

5 голосов
/ 13 апреля 2019

Обе ваши петли for делают копии

for (Waiter element : restaurant1.GetWaitersVector())

, вы хотите изменить ссылки на реальные объекты

for (Waiter& element : restaurant1.GetWaitersVector())
2 голосов
/ 13 апреля 2019

for (Waiter element : restaurant1.GetWaitersVector()) работает с копией вектора.

Если вы хотите работать с эталоном, используйте

for (auto& element : restaurant1.GetWaitersVector())
  // ^^^^^

.


Нокроме того, что упомянуто выше, показ вашего интернированного вектора - плохая идея дизайна.Вам лучше иметь геттер, который выполняет

inline const std::vector<Waiter> &GetWaitersVector() const { return waiters_vector_; }

и, таким образом, заставляет клиентов, обращающихся к нему, использовать определенные функции вашего класса, такие как AddWaiter(), для его изменения.

1 голос
/ 13 апреля 2019

Как я могу получить доступ к закрытому вектору вне класса?Я хочу изменить параметры этого объекта.

Вы не делаете.Или, скорее, вам нужно решить: является ли вектор официантов чем-то частным или нет?Это деталь реализации, о которой код, использующий этот класс, не должен знать?Если нет, вы действительно хотите иметь возможность манипулировать им как есть снаружи?Или, возможно, вы хотите использовать PIMPL идиома , чтобы предоставить метод .waiters(), который возвращает неясный класс, с такими методами, как add(...), `remove (...) и т. Д .?

Это дизайнерские решения, которые вы должны принять.

...