vector.resize 不是在 C++ 中增加向量的大小

vector.resize isn't increasing size of the vector in c++

我是一个c++初学者。我正在练习如何使用 class 和头文件。该程序管理建筑物的租金。它有一个 Rent class 和一个 Floor class。下面是这些 class 的一些定义。

rent.cpp(仅复制重要功能)


管理有关 Floor 的信息并且有 vector<Floor> paid_by_floors; 属性。

#include "rent.hh"

void Rent::set_floor_count(int count){
    this->paid_per_floors.reserve(count);
    this->paid_per_floors.resize(count);
}

void Rent::set_floor(int index, Floor floor){
    this->paid_per_floors[index] = floor;
}

Floor Rent::get_floor(int index){
    return this->paid_per_floors[index];
}

floor.cpp(仅复制重要功能)


管理有关房间的信息并有 vector<Floor> paid_by_rooms; 属性。

#include "floor.hh"

void Floor::set_room_count(int count){
    this->paid_per_rooms.resize(count, 0);
}

int Floor::get_room_amount(int index){
    return this->paid_per_rooms[index];
}

void Floor::set_room_amount(int index, int amount){
    this->paid_per_rooms.push_back(amount);
    // Tried with paid_per_rooms[index] = amount;
}

main.cpp

int main(int argc, char const *argv[])
{

    Rent m_rent(5);
    cout << m_rent.get_floor_count() << endl; // stdout line:1

    m_rent.set_floor_count(2);
    cout << m_rent.get_floor_count() << endl; // stdout line:2 (correct)

    m_rent.get_floor(0).set_room_count(5);
    cout << m_rent.get_floor(0).get_room_count() << endl; // stdout lines:3 (incorrect)

    m_rent.get_floor(0).set_room_amount(0, 100);
    m_rent.get_floor(0).get_room_amount(0); // stdout line:4 (seg fault)

    return 0;
}

并在 stdout 上输出。

5
2
0
Segmentation fault (core dumped)

如您所见,当我更改 paid_per_floors 矢量的大小时。有用。但是,它不适用于 paid_per_rooms。此外,它 returns 代表 OutOfBound 的分段错误。我该如何解决?

之前做过一些研究

在 google 上搜索了关于此问题的查询,例如 vector resize does not work, 矢量调整大小不会增加大小。答案是使用 push_back 而没有像 vec[0] 这样的数组索引。在 set_room_count 函数中,我也在 resize 之前使用了 reserve。但是,问题并没有得到解决。

Floor Rent::get_floor(int index) {
    return this->paid_per_floors[index];
}

return 是 Fl​​oor 对象的一个​​副本,您将预留应用到该副本,而原始对象仍未更改。

您应该return一个引用,以便您更改原始对象:

Floor& Rent::get_floor(int index) {
    return this->paid_per_floors[index];
}