如何从类外部修改向量

How can I modify a vector from outside the class

本文关键字:修改 向量 外部      更新时间:2023-10-16

如何访问类外的私有向量?我想修改此对象的参数。

我尝试制作 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;
}
}

结果:000

你的两个for循环都在制作副本

for (Waiter element : restaurant1.GetWaitersVector())

要修改对实际对象的引用

for (Waiter& element : restaurant1.GetWaitersVector())

for (Waiter element : restaurant1.GetWaitersVector())使用向量的副本进行操作。

如果要对引用使用进行操作

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

相反。


但除了上面提到的之外,暴露你的实习载体是一个糟糕的设计理念。你应该有一个 getter 可以

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

从而强制访问它的客户端使用类的特定函数(如AddWaiter()(来修改它。

如何访问课外的私人向量?我想修改此对象的参数。

你没有。或者更确切地说,您需要决定:服务员的载体是私人的,还是不是?是使用此类的代码不应注意的实现细节吗?如果没有,你真的希望能够在外面按原样操纵它吗?或者,也许您想使用 PIMPL 习惯用法来提供一个返回晦涩类的.waiters()方法,该方法包括 add(...) 、'remove(...( 等?

这些是您需要做出的设计决策。