在单个变量

时间:2015-10-15 08:32:42

标签: c++ qt casting qlist qmap

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

我创建了一个包含每个对象的QMap:

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

但是我想在我的Controller中检索所有这些QMap并将它从控制器发送到我的View的paintEvent()类。 有没有办法将QMap存储在QList中,如下所示:

QList<QMap<int, void*>>

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您可以使用结构将它们捆绑在一个对象中:

int id = parameter.ID;

CustomTableItemProvider provider = new CustomTableItemProvider(CMSContext.CurrentUser);

entity = provider.GetItem(id, TrainingPlanConstants.TrainingPlanTableName);

虽然指向QMap是有效的,但如果你不需要指向它,那么我会反对它。

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

这样你就不必担心堆分配/解除分配。

如果您的编译器支持C ++ 11,那么您可以使用std::tuple将项目组合在一起。

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

答案 1 :(得分:1)

首先,是的,您可以使用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;

答案 2 :(得分:0)

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

QMap<int, MyBaseClass*> allObjects;