首先抱歉英语不好。我尝试搜索+-类似的问题,但找不到。
我尝试减少示例以提高可读性。感谢您的帮助。
问题: 我有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;
}
感谢帮助!
答案 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]; }
您正在创建盒子的副本。在副本中添加元素不会更改原始元素。继续按照本教程进行操作,直到引入引用为止,这应该给您提示。