【问题标题】:Creating 2-dimensional vector in class C++在 C++ 类中创建二维向量
【发布时间】:2011-08-11 07:13:23
【问题描述】:

我需要创建一个充满整数的向量。但是,我不断收到错误:

错误:数字常量之前的预期标识符 错误:数字常量前应为 ',' 或 '...'

using namespace std;

class Grid {
  public:

  Grid();

  void display_grid();
  void output_grid();

  private:

  vector<int> row(5, 0);
  vector<vector<int> > puzzle(9, row);
  int rows_;
  int columns_;

};

【问题讨论】:

  • 如果您有一些 C++ 的基本知识,将会有所帮助。例如,如何初始化类成员数据。

标签: c++ class vector


【解决方案1】:

您不能在声明成员变量时对其进行初始化。为此在构造函数中使用初始化列表:

Grid::Grid()
  : row(5,0), puzzle(9, row),
    rows_(5), columns_(9)
{
}

【讨论】:

    【解决方案2】:

    C++ 类定义的局限性在于您不能在声明它们的位置内联初始化成员。很遗憾,但它已在 C++0x 中得到一定程度的修复。

    无论如何,您仍然可以使用ctor-initializer 语法提供构造函数参数。你可能以前没见过,但是:

    struct T {
       T() : x(42) {
          // ...
       }
    
       int x;
    };
    

    是您初始化成员的方式,您之前可能曾尝试(但失败)int x = 42;

    所以:

    class Grid {
      public:
    
      Grid();
    
      void display_grid();
      void output_grid();
    
      private:
    
      vector<int> row;
      vector<vector<int> > puzzle;
      int rows_;
      int columns_;
    };
    
    Grid::Grid()
      : row(5, 0)
      , puzzle(9, row)
    {
      // ...
    };
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      你不能在类声明中初始化一个成员,除非它是const static,因为在 C++ 中,当你声明一个类时,不会运行/生成任何代码。您必须在构造函数中初始化它们。

      【讨论】:

        【解决方案4】:

        您应该在类构造函数中初始化成员,而不是在声明中。以下内容似乎不正确:

        vector<int> row(5, 0);
        vector<vector<int> > puzzle(9, row);
        

        如果 rowpuzzle 是函数 - 参数应该是类型。如果它们是成员变量 - 在类构造函数中初始化它们。

        【讨论】:

        • 它们的功能如何?它们是对象,它们是用参数构造的(或者这就是意图)。
        • 我知道这是意图,我指出语法错误。在类成员的定义中使用括号用于函数。
        【解决方案5】:

        您不能将可变成员初始化为类定义本身的一部分。而是 do 在构造函数中分配它。

        // ....
        Grid()
        {
             row.resize(5,0) ;
             puzzle.resize(9,row) ;
        }
        private:
           vector<int> row;
           vector<vector<int> > puzzle ;
        // ..
        

        【讨论】:

        • @Tomalak - 我对术语赋值和初始化感到困惑。使用 OP 正在做什么的正确术语是什么?我也不认为这是作业。
        • OP 正在尝试进行初始化。当您在完全构造的对象上调用函数而不是传递构造函数参数时,您的代码不会(尽管最终结果在这里实际上是相同的)。
        • @Tomalak - 如果我的回答令人困惑,说它是初始化,我很抱歉。
        • 这样说是不对的。 :) 当然,您展示的方法仍然有效。
        猜你喜欢
        • 2011-05-08
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 2018-10-16
        • 2016-09-02
        • 1970-01-01
        相关资源
        最近更新 更多