Передача массива объектов через функцию разочарования c ++ - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь взять 2D-массив объектов моего пользовательского класса hexTile и передать их через функцию, используя функцию-член для определенной части 2D-массива. Вот мой main.cpp файл:

int main(int argc, const char * argv[]) {
    static int tile_count=32;

    //To make the initial map
    hexTile tilemap [32][32];

    for(int i=0; i<tile_count; i++ ){
        for(int j=0; j<tile_count; j++ ){
            tilemap[i][j].makeEmpty();
            tilemap[i][j].makeColumnCoordinate(i);
            tilemap[i][j].makeRowCoordinate(j);
            tilemap[i][j].update_onTile(false, false, false, false);
        }
    }

    return 0;
}

void makeCityTile(hexTile (*map)[32][32], int tile_count){
    int center=tile_count/2;
    *map[center][center].makeExists();
}

Когда я пытаюсь скомпилировать этот код, в строке *map[center][center].makeExists(); появляется ошибка Member reference base type 'hexTile [32]' is not a structure or union. Это не имеет особого смысла, потому что я определил .makeExists в tile_class.hpp и tile_class.cpp.

1 Ответ

0 голосов
/ 12 октября 2019

Это из-за приоритета оператора: *map[center][center].makeExists() равно *(map[center][center].makeExists()), но вы имели в виду (*map)[center][center].makeExists(). Однако вы должны просто написать следующее:

void makeCityTile(hexTile map[32][32], int tile_count) {
    int center=tile_count/2;
    map[center][center].makeExists();
}

Это потому, что в C и C ++, когда вы передаете массив в функцию, он только передает указатель на этот массив, он не передаеткопия всего массива по значению. См. Что такое распадающийся массив? для получения более подробной информации.

Чтобы избежать путаницы, может быть полезно создать класс для представления карты и добавить функции-члены для управления этой картой. И пока вы занимаетесь этим, C ++ предоставляет std::vector<>, который обычно является гораздо более приятным способом хранения массива. Вот быстрый пример того, как это может выглядеть:

class Map {
    const size_t count;
    std::vector<hexTile> tiles;

    public:
    Map(size_t count): count(count), tiles(count * count) {
        // put the initialization code from your main() here
    }
    hexTile &at(size_t x, size_t y) {
        return &tiles[y * count + x];
    }
    void makeCityTile() {
        at(count / 2, count / 2).makeExists();
    }
    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...