1

我正在使用 Qt 开发游戏。我的角色/对象存储在我的模型类中(我尝试遵循 MVC 模型)。

我为每个对象创建了一个 QMap:

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

但是后来我想在我的控制器中检索所有这些 QMap 并将其从控制器发送到我的视图的paintEvent() 类。有没有办法像这样将 QMap 存储在 QList 中:

QList<QMap<int, void*>>

然后投呢?我正在寻找一种从单个对象访问这些 QMap 的方法。

谢谢您的帮助 !

4

3 回答 3

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);
于 2015-10-15T08:34:40.407 回答
1

首先,是的,你可以使用 aQList来达到这个目的,但是我建议先创建一个接口类并在你的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;
于 2015-10-15T08:38:24.493 回答
0

您可以为所有特定对象保留指向基类的指针:

QMap<int, MyBaseClass*> allObjects;
于 2015-10-15T08:36:48.553 回答