Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从类外修改向量_C++_Vector_Objective C++ - Fatal编程技术网

C++ 如何从类外修改向量

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_; }

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

我尝试使用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

两个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;第一个循环是复制迭代的每个元素,其范围是循环本身,即在当前迭代结束时销毁。我只是想补充一下,让你明白一点。你的答案很简单,切中要害!