qt序列化指针的qlist

时间:2013-01-19 16:44:33

标签: qt pointers serialization qlist

我正在实施游戏。 我有一张地图,分为描述地形图的单元格。每个单元格应该是类地形的一个实例。我需要序列化这个地图,文件必须尽可能小,因为它将通过互联网在玩家之间同步(如果可能的话,几个Mb)。 但 如果我以这种方式创建一个地图(大小为4500x3000个单元格),则该文件为百万个Mb。 所以我必须使用指针,因为大多数地形将完全相同;可能我会有大约30个不同的地形。 我有这个polist的Qlist,问题是出来的文件和我创建所有元素一样大,我不明白为什么。 这是我的代码,可能存在一些重大错误。

map.hpp #ifndef MAP_HPP #define MAP_HPP #include "include.hpp" #include "terrain.hpp" class map { public: map(); map(unsigned int width, unsigned int height); QList<terrain*> get_grid(); void let_snow(unsigned int x, unsigned int y); void display_snow_map(); void save(); void load(); private: QList<terrain*> grid_; unsigned int width_; unsigned int height_; }; ---------------------------------- map.cpp #include "map.hpp" map::map() {} map::map(unsigned int width, unsigned int height) { width_=width; height_=height; for(unsigned int i=0; i<height; i++) { for(unsigned int j=0; j<width; j++) { grid_.append(new terrain(1,0,j,i)); } } } void map::save() { QFile save_file("map.brt"); save_file.open(QIODevice::WriteOnly); QDataStream out(&save_file); out << grid_ << width_ << height_; save_file.close(); } void map::load() { QFile load_file("map.brt"); load_file.open(QIODevice::ReadOnly); QDataStream in(&load_file); in >> grid_ >> width_ >> height_; load_file.close(); } ---------------------------- terrain.hpp #ifndef TERRAIN_HPP #define TERRAIN_HPP #include "include.hpp" class terrain { public: terrain(); terrain(qint8 type, qint8 snow, qint16 x, qint16 y); qint8 get_type(); qint8 get_snow(); qint16 get_xcoord(); qint16 get_ycoord(); void set_snow(qint8 snow); void set_xcoord(qint16 x); void set_ycoord(qint16 y); void save(QDataStream &out); void load(); friend QDataStream &operator <<(QDataStream &out, const terrain &ter); friend QDataStream &operator >>(QDataStream &in, terrain &ter); friend QDataStream &operator <<(QDataStream &out, const terrain *ter); friend QDataStream &operator >>(QDataStream &in, terrain *ter); private: qint8 type_; qint8 snow_; qint16 xcoord_; qint16 ycoord_; }; #endif // TERRAIN_HPP ----------------------------------------- terrain.cpp QDataStream &operator <<(QDataStream &out, const terrain &ter) { out << ter.xcoord_ << ter.ycoord_ << ter.type_ << ter.snow_; return out; } QDataStream &operator >>(QDataStream &in, terrain &ter) { in >> ter.xcoord_ >> ter.ycoord_ >> ter.type_ >> ter.snow_; return in; } QDataStream &operator <<(QDataStream &out, const terrain *ter) { out << ter->xcoord_ << ter->ycoord_ << ter->type_ << ter->snow_; return out; } QDataStream &operator >>(QDataStream &in, terrain *ter) { in >> ter->xcoord_ >> ter->ycoord_ >> ter->type_ >> ter->snow_; return in; }

谢谢

1 个答案:

答案 0 :(得分:0)

您的计划确实与您说完全相同,但不是您想要的。您必须了解C ++中的指针(在这里您可以阅读Pointers - C++ Documentation)。

在您的代码中,您确实将所有单元格转储到文件中。

如果要最小化文件大小,则必须考虑网格的结构。如果你说平均地图你将有近30个地形,那么可能是,没有必要保存你的大量数据,但使用一些命名系统(使用你的地形名称),使用另一种数据结构(对于例如QMap)。

希望,你会明白我的想法!祝你好运!