类与类的向量

时间:2019-03-10 09:25:28

标签: c++ vector

首先抱歉英语不好。我尝试搜索+-类似的问题,但找不到。

我尝试减少示例以提高可读性。感谢您的帮助。

问题: 我有3类(“房间”,“盒子”,“球”),带有向量类。 类“ Room”的向量为“ Box”。 “盒子”的向量是“球”。

尝试从球向量(room-> box(0)-> ball(0))获取一些数据后,出现错误“表达式:向量下标超出范围”,但是我使用方法“ addBall”添加了元素

代码:

#include <vector>
#include <iostream>
#include <string>


class Ball
{
public:
    Ball() { name = "ball"; }
    std::string getName() { return name; }
    Ball getThis() { return *this; }

private:
    std::string name;
};

class Box
{
public:
    Box() { name = "Box"; ballList.resize(0); }
    std::string getName() { return name; }
    void addBall() { ballList.push_back(Ball()); }
    Box getThis() { return *this; }
    Ball getBall(int var) { return ballList[var]; }
private:
    std::vector <Ball> ballList;
    std::string name;
};

class Room
{
public:
    Room() { name = "Room"; boxList.resize(0); }
    std::string getName() { return name; }
    void addBox() { boxList.push_back(Box()); }
    Box getBox(int var) { return boxList[var]; }


private:
    std::vector <Box> boxList;
    std::string name;
};

int main()
{
    Room room;

    room.addBox();
    room.getBox(0).addBall();
    std::cout << room.getBox(0).getBall(0).getName();

    return 0;
}

感谢帮助!

2 个答案:

答案 0 :(得分:1)

更改此

Box getBox(int var) { return boxList[var]; }

对此

Box& getBox(int var) { return boxList[var]; }

您的版本未在会议室中返回一个框,而是返回了该会议室中的框的副本。因此,您不是将球添加到房间的盒子中,而只是添加到房间中的盒子的副本中。原始框未更改。

我的版本将引用返回到原始框,因此,当您添加球时,您将添加到正确的框。

您还应该更改此

Ball getBall(int var) { return ballList[var]; }

对此

Ball& getBall(int var) { return ballList[var]; }

出于同样的原因。

您还应该删除这些

Ball getThis() { return *this; }
Box getThis() { return *this; }

因为它们没有用处。

答案 1 :(得分:0)

在这一行:

Box getBox(int var) { return boxList[var]; }

您正在创建盒子的副本。在副本中添加元素不会更改原始元素。继续按照本教程进行操作,直到引入引用为止,这应该给您提示。