如何在班级之外访问私有引导程序?我想修改该对象的参数。
我尝试使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
答案 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(...)等方法?>
这些是您要做出的设计决策。