如何在C ++中使用传入的值作为数组索引?

时间:2013-02-24 18:38:58

标签: c++ arrays parameter-passing

所以我试图通过创建一个基本的国际象棋游戏来学习C ++。 随着附加的皱纹,用户可以创建非标准尺寸的板(即,不一定是8×8)

一旦我从用户那里收到了电路板的尺寸,我应该设置为以固定尺寸创建它。所以我想在这里使用数组。

编译器不喜欢我的声明:

 tile arrayOfTiles[numX][numY];

似乎告诉我它想要一个常数作为数组索引。 这是我甚至可以用数组做的事吗?

class gameBoard{
    public:
    gameBoard(int x=8, int y=8)
    :   numX(x),
        numY(y)
{
    //construct board
    tile arrayOfTiles[numX][numY];

    /*
    for (int i=0; i<numX; i++) {
        for (int j=0; j<numY; j++){
            arrayOfTiles[i][j]=tile();
            }
        }
    */
}

protected:
    int numX;  //total number of rows, typically 8 (A-H) on a chessboard
    int numY;  //total number of columns, typically 8 (1-8) on a chessboard

};

2 个答案:

答案 0 :(得分:4)

使用std::vector

std::vector<std::vector<tile>> arrayOfTiles(numX, std::vector<tile>(numY));

使用typedef来简化它:

typedef std::vector<tile>  vectiles;

std::vector<vectiles> arrayOfTiles(numX, vectiles(numY));

vectiles是图块的向量,arrayOfTilesvectiles的向量。您可以将其视为二维数组。

for(size_t i = 0 ; i < numX; ++i)
{
     for(size_t j = 0 ; j < numY; ++j)
         //use arrayOfTiles[i][j]
}

您可以分别使用numXnumY,而不是arrayOfTiles.size()arrayOfTiles[i].size()

答案 1 :(得分:0)

你可以在这里做的最好的事情是让gameBoard在内部持有arrayOfTiles作为其数据成员之一,而不是C风格的数组,而应该使用std::vector代替:

protected:
    std::vector< std::vector<tile> > arrayOfTiles;

然后你可以在初始化列表中初始化它:

public:
    gameBoard(int x = 8, int y = 8)
    : numX(x), numY(y), arrayOfTiles(x, std::vector<tile>(y));
    {
        // ...
    }