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

时间:2017-12-13 19:55:59

标签: c++ class variables

我正在使用Visual Studio 2017 for school在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;
}

header.h

#ifndef CLUSTE2R_H
#define CLUSTE2R_H
#pragma once
#include <iostream>
#include <vector>
using namespace std;  
#endif

Car.h

#ifndef CLUSTE1R_H
#define CLUSTE1R_H
#pragma once
#include "Vehicle.h"

using namespace std;


class Car : public Vehicle
{
public:
    int id;
    Car(int id);
    ~Car();
};

#endif

Car.cpp

#include "Car.h"

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


Car::~Car()
{
}

Vehicle.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文件有关。但我不太确定如何以任何其他方式实现我想要的......

1 个答案:

答案 0 :(得分:1)

目前,当您从Vehicle调用getCars()函数时,您将返回向量的新实例,这意味着向量的所有更改都不会应用于类中的原始向量。

要解决此问题,您只需返回向量的引用(将vector<Car> getCars();更改为std::vector<Car>& getCars())。

您还可以制作矢量的本地副本,然后将矢量设置为类。