【问题标题】:Initializing a vector of vectors of objects初始化对象向量的向量
【发布时间】:2018-03-15 11:04:56
【问题描述】:

我在创建对象向量的向量时遇到问题。 我们的目标是得到一个像棋盘一样的东西,每个领域都有一个 然后可以使用向量访问的对象。

#include<vector>
using namespace std;

class raster;

class field{
  int x, y;
public:
  field(int x, int y) : x(x), y(y) {};
  friend class raster;
};

class raster{
  const size_t s=12;
  vector<vector<field> > game_row(s,vector<field>game_column(s,0)); //here I get the second error
public:
  friend class field;
};

所以我希望向量的向量成为不同类的成员,但每次我使用 g++ 编译时都会显示
错误:“s”不是类型
错误:在 '(' token

之前需要 ',' 或 '...'

对不起,如果我混淆了帖子的格式,
我对 c++ 很陌生,这是我在这里的第一篇文章。

【问题讨论】:

  • 0 无法初始化field...

标签: c++ vector initialization


【解决方案1】:

应该是这样的:

class raster{
  const static size_t s=12;
  vector<vector<field> > game_row{s,vector<field>(s,field(0,0))}; //here I get the second error
public:
  friend class field;
};
  1. t 应该是静态的
  2. 使用初始化表达式,这样编译器就不会将该表达式识别为函数声明表达式

【讨论】:

  • 这不会编译。您不能在向量内命名向量。删除game_column。您也不能用 0 初始化 field
  • @super 是的,这是一个错误,已修复
  • @MichaelWalz 现已修复
【解决方案2】:

那一行代码有很多问题:

vector<vector<field> > game_row(s,vector<field>game_column(s,0));

首先 - game_column 是什么?看起来您正试图将向量元素声明为命名变量;这不是它的工作原理。我认为你应该完全删除game_column

然后,您的问题是game_row 的声明看起来像函数声明,而不是变量声明。 (令人困惑的是,C++ 允许使用您用来声明变量的语法,但不能立即在类声明中使用 - 仅在其他上下文中,例如在函数内部!)。

您可以使用其他语法,例如:

vector<vector<field>> game_row {s,vector<field>(s,0)}; // C++11 +

或者对于C++98,你需要添加一个显式的构造函数并初始化初始化列表中的数据成员:

    size_t s;
    vector<vector<field> > game_row;
public:
    raster() : s(12), game_row(s, vector<field>(s,0)) { }

(从这里我将假设您使用的是 C++11)。

但是,此更改仍会产生错误;你不能只用一个int 初始化一个field 对象,因为你指定它的构造函数需要一对int 值。因此,您需要:

vector<vector<field>> game_row {s,vector<field>(s,{0,0})};

【讨论】:

  • 谢谢,这帮助很大!起初我没有想到要为向量命名,但现在我知道了!代码现在可以工作了。
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2011-03-04
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多