C++ 如何从类外修改向量
我如何获得对类外私有向量的访问权?我想修改此对象的参数 我尝试使用getter并通过引用返回向量,但当我尝试更改主函数中向量中包含的对象的参数时,向量中的更改不会被保存C++ 如何从类外修改向量,c++,vector,objective-c++,C++,Vector,Objective C++,我如何获得对类外私有向量的访问权?我想修改此对象的参数 我尝试使用getter并通过引用返回向量,但当我尝试更改主函数中向量中包含的对象的参数时,向量中的更改不会被保存 class Restaurant { std::vector <Waiter> waiters_vector_; public: inline std::vector<Waiter> &GetWaitersVector() { return waiters_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两个for循环都在复制
for (Waiter element : restaurant1.GetWaitersVector())
您希望修改对实际对象的引用
for (Waiter& element : restaurant1.GetWaitersVector())
对于服务员元素:restaurant1.GetWaitersVector使用向量的副本进行操作
如果您想在参考上操作,请使用
for (auto& element : restaurant1.GetWaitersVector())
// ^^^^^
相反
但是除了上面提到的,暴露你的实习向量是一个糟糕的设计想法。你应该有一个这样的getter
inline const std::vector<Waiter> &GetWaitersVector() const { return waiters_vector_; }
从而迫使访问它的客户机使用类的特定函数(如AddWater)来修改它
我如何获得对类外私有向量的访问权?我想修改此对象的参数
你没有。或者更确切地说,你需要决定:服务员的向量是私人的,还是不是私人的?这是使用此类的代码不应该知道的实现细节吗?如果不是,你真的想像在外面一样操纵它吗?或者,您可能希望使用提供一个.waiters方法,该方法返回一个模糊的类,其中包含add…、`remove…,等等方法
这些都是您需要做出的设计决策。非常确定auto元素不是参考,而是副本。你是说侍者和元素吗?@KonradRudolph我不确定auto是否应该自动推断出引用,为了澄清起见,ty。@πάνταῥεῖ AFAIK auto从不推断引用。@πάνταῥεῖ - 这是非常正确的。你说使用向量的副本进行操作,但我认为你的意思是使用元素的副本进行操作。不?软件设计说明:将向量私有化的全部目的是控制类的接口及其与其余代码的通信。通过getter公开向量几乎完全没有意义,并且违反了“告诉,不要问”的设计原则。类不应提供直接访问,而应选择性地提供只修改那些实际需要修改的方面的方法,这些方法应尽可能少,理想情况下没有。编译错误:void Restaurant::AddWaiterWaiter tmp在声明中给出错误:在成员“AddWaiter”[-fppermissive]~Restaurant上额外限定“Restaurant::”;可能想成为~Restaurant=default;第一个循环是复制迭代的每个元素,其范围是循环本身,即在当前迭代结束时销毁。我只是想补充一下,让你明白一点。你的答案很简单,切中要害!