Получить разные Qmap в одной переменной

Я работаю над игрой в Qt. Мои персонажи/объекты хранятся в моем классе модели (я стараюсь следовать модели MVC).

Я создал QMap, содержащий для каждого объекта:

QMap<int, Safe*> *safes;
QMap<int, Mushroom*> *mushroom;
QMap<int, Floor*> *floors;

Но затем я хотел бы получить все тезисы QMap в моем контроллере и отправить его в класс paintEvent() моего представления из контроллера. Есть ли способ сохранить QMap в QList следующим образом:

QList<QMap<int, void*>>

А потом лить? Я ищу способ доступа к тезисам QMap из одного объекта.

Спасибо за помощь !


person ltheron    schedule 15.10.2015    source источник
comment
не имеет отношения, но почему указатели на qmap?   -  person UmNyobe    schedule 15.10.2015
comment
потому что я изменяю их в своем контроллере   -  person ltheron    schedule 15.10.2015


Ответы (3)


Вы можете использовать структуру, чтобы связать их внутри одного объекта:

struct Maps
{
    QMap<int, Safe*> *safes;
    QMap<int, Mushroom*> *mushroom;
    QMap<int, Floor*> *floors;
};

Хотя допустимо иметь указатель на QMap, если вам не нужно удерживать указатель на него, я бы не советовал этого делать.

struct Maps
{
    QMap<int, Safe*> safes;
    QMap<int, Mushroom*> mushroom;
    QMap<int, Floor*> floors;
};

Таким образом, вам не нужно беспокоиться о выделении/освобождении кучи.

Если у вас есть компилятор, поддерживающий C++11, вы можете использовать std::tuple для группировать предметы вместе.

std::tuple<QMap, QMap, QMap> maps (safes, mushroom, floors);
person Mohamad Elghawi    schedule 15.10.2015
comment
Возможно, использование класса было бы лучше. Я предполагаю, что если он захочет их как-то сгруппировать, он захочет применить операции. По этой причине, вероятно, было бы лучше иметь класс, нет? +1 за указатель на QMap - person LBes; 15.10.2015
comment
Кстати, есть что-то под названием std::tuple, если вы хотите быть легким и удобным :) - person yzn-pku; 15.10.2015
comment
@LBesancon Как вы знаете, в C ++ единственная разница между структурой и классом заключается в их спецификаторах доступа по умолчанию и способе их наследования. Таким образом, вы можете иметь методы в своей структуре, если хотите. Однако я склонен использовать структуры, когда мне нужно сгруппировать некоторые данные без каких-либо методов, но это полностью зависит от вас. - person Mohamad Elghawi; 15.10.2015
comment
@yzn-pku Ты абсолютно прав. Я обновлю свой ответ. - person Mohamad Elghawi; 15.10.2015
comment
@MohamadElghavi уверен, что в вашей структуре могут быть методы. Это больше вопрос того, что вы привыкли делать. В основном я склонен создавать классы всякий раз, когда возникает необходимость, но вы правы. Все равно не понизил ваш ответ за это;) - person LBes; 15.10.2015

Во-первых, да, вы можете использовать QList для этой цели, однако я бы предложил сначала создать класс интерфейса и использовать его в своем QMap.

struct GameObjectInterface {
};

class Safe : public GameObjectInterface {};
class Mushroom : public GameObjectInterface {};
class Floor : public GameObjectInterface {};

QMap<int, GameObjectInterface*> _GameObjects;

// Is game object with ID `n` a `Safe`?

Safe* s = dynamic_cast<Safe*>(_GameObjects[n]);
if (s != nullptr) {
    // Yes it is a safe
}

Другая возможность:

QList<QMap<int, GameObjectInterface*>> _GameObjects;

И если вы хотите, вы можете объединить все в одну структуру, как намекают другие респонденты.

struct MyGameObject {
    QMap<int, Safe*> Safes;
    QMap<int, Mushrooms*> Mushrooms;
    QMap<int, Floor*> Floors;
};

QList<MyGameObject> _GameObjects;

Если каждый из них связан (один и тот же ключ для всех объектов), его можно упростить, например:

struct MyGameObject {
    Safe* _Safe;
    Mushrooms* _Mushroom;
    Floor* _Floor;
};
QMap<int, MyGameObject*> _GameObjects;
person bkausbk    schedule 15.10.2015

Вы можете сохранить указатель на базовый класс для всех ваших конкретных объектов:

QMap<int, MyBaseClass*> allObjects;
person AnatolyS    schedule 15.10.2015