结构中的向量

时间:2018-01-19 06:27:57

标签: c++ vector struct

所以基本上我正在制作Monoply的简短版本。我需要创建一个结构的向量来包含用户输入的多个玩家的所有信息,其中还包含每个玩家拥有的属性。我有一个功能来创建x数量的玩家,并为每个玩家分配起始现金。但是,当我编译此代码时,我收到错误libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector。我究竟做错了什么?谢谢!

void createPlayers(Board b, Rules r, int players)
{
  for(int i = 0; i < players; i++)
  {
    b.listOfPlayers.at(i).cash = r.startCash;
  }

  for(int i = 0; i < players; i++)
  {
    cout << b.listOfPlayers.at(0).cash;
  }
}

typedef struct Player_Struct
{
  int cash;
  vector<char> propertiesOwned;
} Player;

typedef struct Board_Struct
{
  vector<char>listOfProperties;
  vector<Player_Struct> listOfPlayers;
} Board;

这是解决问题的好方法吗?玩家的数量取决于用户,我无法在struct初始化中初始化一定数量的player_structs。我的想法是创建一个所有玩家的矢量列表,然后能够从矢量列表中的每个玩家中提取信息。即使我的代码非常糟糕,我至少在逻辑上是正确的吗?我还是刚接触C的C ++新手。

2 个答案:

答案 0 :(得分:0)

发生错误时,您不显示任何输出,也不显示变量值。

您可以引用向量中的元素与正常数组中的元素相同,例如b.listOfPlayers[i]

最好指定库,最好写std::vector<int>而不是vector<int>

您无需传递players,只需在向量.size()上使用内置函数,例如b.listOfPlayers.size()

您不需要在结构上指定typedef

总结一下人们所说的话还有一点点。也许不是你想要的答案,而是你需要的答案。

答案 1 :(得分:-1)

我可以看到来自C的你会选择使用Structs来编写这个项目,但你正在使用C ++,你可以使用OOP概念。

通过将结构更改为类来开始,这样您就可以使用继承,封装,抽象和多态概念。看看this。将Structs保留为POD,并将Classes用于其他所有内容

如果您正在学习C ++,使用C ++编写代码并使用其功能,请避免将C ++用作C类。

回到原来的问题; 如果要添加到矢量,请使用push_back。在您的情况下,listOfPlayers看起来是空的或i超出界限,因此当您根据文档调用.at时;

  

如果它大于或等于矢量大小,则抛出out_of_range类型的异常。

要解决此问题,请使用push_back将项添加到向量中,并确保i位于向量的范围内。

我建议你阅读this