创建C ++类的2D数组

时间:2018-02-04 14:01:28

标签: c++ arrays

我正在使用一个名为libtcod的C ++引擎在类似流氓的游戏中打印出ASCII字符。

在游戏中,我想将“地图”表示为地图类型的二维数组,其中包含瓷砖的“layer1”,例如Grass,Sand,Water,以及第二层,用于表示layer2顶部的对象,例如树木和巨石。

我创建了Map类,它包含两个属性;一个是Tile类型,另一个是Object类型。

但是我似乎在创建2D数组本身时遇到了困难。

我收到错误:“数组可能没有此类型的元素”

#include "libtcod.hpp"
#include <ctime>
#include <stdio.h>
#include <ciso646>
#include <cstring>

static const TCODColor colour_darkWall(128, 128, 128);
static const TCODColor colour_grass(0, 255, 0);
static const TCODColor colour_black(0, 0, 0);
static const TCODColor colour_white(255, 255, 255);
static const TCODColor colour_blue(0, 0, 255);
static const TCODColor colour_brown(139, 69, 19);
static const TCODColor colour_red(255, 0, 0);

int i, j;

class object {
public:
    char name[20];
    TCODColor colour;
    char symbol;
    bool passable;
    object(int layer_id) {
        if (layer_id == 0) { //EMPTY
            strcpy(name, "NA");
            symbol = ' ';
            passable = true;
            colour = colour_white;
        }
        else if (layer_id == 1) { //TREE
            strcpy(name, "Tree");
            symbol = '^';
            passable = false;
            colour = colour_grass;
        }
        else if (layer_id == 2) { //ROCK
            strcpy(name, "Rock");
            symbol = 'R';
            passable = false;
            colour = colour_black;
        }
    }
};

class tile {
public:
    char name[20];
    TCODColor colour;
    bool passable;
    tile(int layer_id) {
        if (layer_id == 0) { //WATER
            strcpy(name, "Water");
            colour = colour_blue;
            passable = false;
        }
        else if (layer_id == 1) { //GRASS
            strcpy(name, "Grass");
            colour = colour_grass;
            passable = true;
        }
        else if (layer_id == 2) { //SAND
            strcpy(name, "Sand");
            colour = colour_brown;
            passable = true;
        }
    }

};

class Map {
public:
    tile layer1;
    object layer2;
    Map(int layer1_id, int layer2_id) {
        layer1 = tile(layer1_id);
        layer2 = object(layer2_id);
    }
};


int main() {
    const int window_x = 150;
    const int window_y = 50;

    Map[][] map = new Map[5][5];


    TCODConsole::initRoot(window_x, window_y, "CivSim v0.1", false);
    while (!TCODConsole::isWindowClosed()) {
        TCODConsole::root->clear();
        TCODConsole::root->putChar(0, 0, map.layer2.symbol);
        TCODConsole::flush();
    }

    return 0;
}

不确定如何创建有问题的2D阵列。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Map[][] map = new Map[5][5];不合法。只能省略第一个维度。您需要Map[][5] map = new Map[5][5];或更好Map (*map)[5] = new Map[5][5];

原因是在类型中使用[]的这些符号只是描述指针类型的另一种(并且令人困惑)方式。所以int[] x只是一种不同的写作方式int* xMap[][5] m只是写Map (*m)[5]的另一种方式(也就是指向五个数组的数组的指针)。

我认为你应该总是使用这些符号的指针版本,它更准确地描述了你真正在做的事情。从长远来看编写看起来像你有一个数组的代码,当你实际拥有的只是一个指针令人困惑。

那么为什么不是Map[][]另一种写作方式Map**?这是因为C和C ++中数组和指针之间的相似性仅适用于一个级别。二维数组是指向指针数组的指针的根本不同的结构。因此int[5][5]int**不兼容,因此没有理由让int[][]int**相同。