我如何从课堂之外修改向量

时间:2019-04-13 13:30:22

标签: c++ vector objective-c++

如何在班级之外访问私有引导程序?我想修改该对象的参数。

我尝试使getter并通过引用返回向量,但是当我尝试更改主函数中vector中包含的对象的参数时,vector中的更改不会保存。

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 个答案:

答案 0 :(得分:5)

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

for (Waiter element : restaurant1.GetWaitersVector())

您要修改对实际对象的引用

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

答案 1 :(得分:2)

const express = require("express"); const router = express.Router(); console.log("azerty"); router.post("/", (req, res)=>{ console.log("qwerty"); res.status(200).send("hello"); }); module.exports = router; 使用向量的副本。

如果要对参考进行操作,请使用

for (Waiter element : restaurant1.GetWaitersVector())

相反。


但是,除了上面提到的以外,暴露实习矢量是一个糟糕的设计思路。您应该宁可使用这样的吸气剂

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

,从而迫使访问它的客户端使用类中的特定功能,例如inline const std::vector<Waiter> &GetWaitersVector() const { return waiters_vector_; } 来对其进行修改。

答案 2 :(得分:1)

  

如何在班级之外访问私有引导程序?我想修改该对象的参数。

你不知道。或更确切地说,您需要决定:服务员的载体是否是私人的,不是吗?使用此类的代码不应该了解实现细节吗?如果不是,您是否真的希望能够在外部按原样操作它?还是您想使用PIMPL idiom提供一个.waiters()方法,该方法返回一个晦涩的类,并带有add(...),`remove(...)等方法?

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