C++ 通过向量更改对象变量的值

C++ 通过向量更改对象变量的值,c++,class,variables,C++,Class,Variables,我正在为学校使用Visual Studio 2017在cpp中开发一个模拟游戏,在开发阶段,我陷入了这种情况。 因此,我所做的是创建一个新项目,尝试以最简单的形式重新创建该问题,以便更容易调试 以下是主文件和所有相关源代码: main.cpp #include "header.h" #include "Vehicle.h" #include "Car.h" int main() { Vehicle v; v.addCar(1); v.addCar(2); v

我正在为学校使用Visual Studio 2017在cpp中开发一个模拟游戏,在开发阶段,我陷入了这种情况。 因此,我所做的是创建一个新项目,尝试以最简单的形式重新创建该问题,以便更容易调试

以下是主文件和所有相关源代码:

main.cpp

#include "header.h"
#include "Vehicle.h"
#include "Car.h"

int main() {

    Vehicle v;

    v.addCar(1);
    v.addCar(2);
    v.addCar(3);


    cout << v.getCars()[1].id << endl;
    v.getCars()[1].id = 99;
    cout << v.getCars()[1].id << endl;
    system("pause");
    return 0;
}
Car.cpp

#include "Car.h"

Car::Car(int id)
{
    this->id = id;
}


Car::~Car()
{
}
车辆.h

#ifndef CLUSTER_H
#define CLUSTER_H
#pragma once

#include <vector>
//#include "Car.h"

class Car;
using namespace std;


class Vehicle
{
private:
    vector<Car> cars;

public:
    Vehicle();
    ~Vehicle();

    vector<Car> getCars();
    void addCar(int id);

};

#endif
Vehicle.cpp

#include "Vehicle.h"
#include "Car.h"
#include <vector>

using namespace std;
//class Car;
Vehicle::Vehicle()
{
}


Vehicle::~Vehicle()
{
}


vector<Car> Vehicle::getCars()
{
    return this->cars;
}

void Vehicle::addCar(int id)
{
    Car c(id);

    cars.reserve(cars.size() + 1);
    cars.push_back(c);
}
所以,我要做的是得到以下输出:

2\n 99

这就是我得到的:

2\n 2


我做错了什么?我认为该问题与main.cpp文件有关。但是我不太确定如何以任何其他方式实现我想要的…

目前,当您从车辆调用getCars函数时,您正在返回一个向量的新实例,这意味着对向量的所有更改将不会应用于类中的原始向量

要解决这个问题,您只需返回向量的引用即可更改向量getCars;到std::vector和getCars


您还可以创建向量的本地副本,然后将向量设置为类。

当您调用getCars时,将创建向量的副本。你只是在修改它的副本。汽车储存汽车有意义吗?那么,我该如何做我需要的?我该如何将汽车储存在汽车中?将其修改为vector&getCars;。但是,把向量作为私有向量是没有意义的。非常感谢。那一次改变就解决了我的问题。这很有道理。我不会再犯那种错误了。谢谢返回一个非常量引用等同于让成员publicas@PythEh在评论中提到,这样做没有意义,因为它是私有成员数据。它还会破坏类的数据封装。您还可以创建一个void editCarint索引int value;类中的函数,该函数将直接编辑向量,而不会将其公开,从而使其保持私有并封装在类中。
#ifndef CLUSTER_H
#define CLUSTER_H
#pragma once

#include <vector>
//#include "Car.h"

class Car;
using namespace std;


class Vehicle
{
private:
    vector<Car> cars;

public:
    Vehicle();
    ~Vehicle();

    vector<Car> getCars();
    void addCar(int id);

};

#endif
#include "Vehicle.h"
#include "Car.h"
#include <vector>

using namespace std;
//class Car;
Vehicle::Vehicle()
{
}


Vehicle::~Vehicle()
{
}


vector<Car> Vehicle::getCars()
{
    return this->cars;
}

void Vehicle::addCar(int id)
{
    Car c(id);

    cars.reserve(cars.size() + 1);
    cars.push_back(c);
}