У меня есть относительно простой вопрос, но я не могу найти ответ, специфичный для моего случая, и я просто не могу подходить к этой проблеме правильным образом. У меня есть класс, который выглядит так:
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;
}
Я понимаю, что существует множество подходов к этому, но я стараюсь сделать эту реализацию максимально конфиденциальной. Если бы кто-то мог указать мне правильное направление, я был бы очень признателен. Спасибо!
TestStruct *_testStruct;
_testStruct = _loadMap.getMapTiles();
Это даст вам указатель на первый элемент в массиве вернул. Затем вы можете перебрать остальные 99.
Я очень рекомендую использовать векторы или другой контейнер и писать геттеры, которые не возвращают указатели на подобные массивы.
Прежде всего, здесь, зачем нам нужен 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;
}
Используйте векторы вместо массивов, где это возможно. Также рассмотрим массив / вектор 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();
}