Как вернуть массив структур из класса в функции получения

У меня есть относительно простой вопрос, но я не могу найти ответ, специфичный для моего случая, и я просто не могу подходить к этой проблеме правильным образом. У меня есть класс, который выглядит так:

struct tileProperties
{
int x;
int y;
};

class LoadMap
{
private:
ALLEGRO_BITMAP *mapToLoad[10][10];
tileProperties *individualMapTile[100];

public:
//Get the struct of tile properties
tileProperties *getMapTiles();
};

У меня есть реализация, которая выглядит так для функции getter:

tileProperties *LoadMap::getMapTiles()
{
return individualMapTile[0];
}

У меня есть код в классе LoadMap, который назначит 100 свойств плитки для каждой структуры в массиве. Я хочу иметь доступ к этому массиву структур в моем файле main.cpp, но я просто не могу найти правильный синтаксис или подход. Мой main.cpp выглядит так.

 struct TestStruct
{
int x;
int y;
};

int main()
{
LoadMap  _loadMap;
TestStruct *_testStruct[100];
//This assignment will not work, is there
//a better way?
_testStruct = _loadMap.getMapTiles();

return 0;
}

Я понимаю, что существует множество подходов к этому, но я стараюсь сделать эту реализацию максимально конфиденциальной. Если бы кто-то мог указать мне правильное направление, я был бы очень признателен. Спасибо!

1

Решение

TestStruct *_testStruct;
_testStruct = _loadMap.getMapTiles();

Это даст вам указатель на первый элемент в массиве вернул. Затем вы можете перебрать остальные 99.

Я очень рекомендую использовать векторы или другой контейнер и писать геттеры, которые не возвращают указатели на подобные массивы.

2

Другие решения

Прежде всего, здесь, зачем нам нужен TestStruct, вы можете использовать саму структуру «tileProperties» …

И чертенок,
tileProperties * IndividualMapTile [100]; массив указателей на структуру.

Следовательно, IndividualMapTile будет иметь указатели в нем.
Вы вернули первый указатель, следовательно, вы можете получить доступ только к первой структуре. Что насчет остальных ????

tileProperties** LoadMap::getMapTiles()
{
return individualMapTile;
}

int main()
{
LoadMap _loadMap;
tileProperties **_tileProperties;
_tileProperties = _loadMap.getMapTiles();

for (int i=0; i<100;i++)
{
printf("\n%d", (**_tileProperties).x);
_tileProperties;
}
return 0;
}
0

Используйте векторы вместо массивов, где это возможно. Также рассмотрим массив / вектор TestStruct напрямую, а не указатели на них. Я не могу сказать, будет ли это подходящим для вас из вашего примера кода.

class LoadMap
{
public:
typedef vector<tileProperties *> MapTileContainer;

LoadMap()
: individualMapTile(100) // size 100
{
// populate vector..
}

//Get the struct of tile properties
const MapTileContainer& getMapTiles() const
{
return individualMapTile;
}

MapTileContainer& getMapTiles()
{
return individualMapTile;
}

private:
MapTileContainer individualMapTile;
};

int main()
{
LoadMap _loadMap;
LoadMap::MapTileContainer& _testStruct = _loadMap.getMapTiles();
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector