当对象包含其他对象的向量时,无法设置值

Cannot set a value when an object contains Vector of another objects

本文关键字:对象 设置 向量 包含 其他      更新时间:2023-10-16

我已经实现了一个包含以下类的C 程序:

class Wheels{
  private:
    bool _needToChange;
  public:
    void SetNeedToChange (const bool needToChange) {_needToChange =  needToChange;} 
};

class Car {
  private:
     vector<Wheels> _wheels;
  public:
     vector<Wheels> GetWheels() {return _wheels;}
};

在主我创建汽车向量:

int main(){
    vector<Car>_cars;
   //Inside two nested for loops I need to set the boolean value 
   _cars[iter1].GetWheels()[iter2].SetNeedToChange(true);
 }

但是,此之后的值总是是错误的。我在做什么错?

几个答案告诉您使返回的向量成为参考。当然,这有效,但这会损害您的封装。一个人可以很容易地做诸如getWheels()。调整大小(0);,这不应从外部进行。

因此,使用登录器:

 Wheels& GetWheels(const unsigned int position){return _wheels[position];}

并用

称呼它
 _cars[iter1].GetWheels(iter2).SetNeedToChange(true);

这假定可以从外部访问车轮对象。您可以选择以

之类的方式选择进一步封装它
void setWheelNeedToChangeStatus(const unsigned int position, const bool status){
    _wheels[position].SetNeedToChange(status);
}

顺便说一句,不确定您使用哪种命名标准,但通常在较低的情况下,至少在我知道的任何惯例中。

在这里:

 vector<Wheels> GetWheels() {return _wheels;}

您返回车轮向量的复制。如果更改它,则不将更改应用于成员向量,仅适用于副本。

而是返回参考:

 vector<Wheels>& GetWheels() {return _wheels;}

您是通过复制返回的:

 vector<Wheels> GetWheels() {return _wheels;}

因此,您修改了该行结束后被破坏的副本。您想要的是返回参考:

 vector<Wheels>& GetWheels() {return _wheels;}
               ^~~~~~~~~~~~~~~~~~!!

您正在获得_wheels vector的副本。

如果您想更改值,最好将其作为参考返回:

vector<Wheels>& GetWheels() {return _wheels;}