我正在创建两个函数来保存对象并将其加载到程序中。
保存功能显然成功保存了对象:
void Game::SaveGame()
{
std::string filename = "saves/miner-save-" + currentDate() + ".gem";
std::ofstream outfile;
outfile.open(filename.c_str(), std::ios::binary);
outfile.write((char *)(&myGame), sizeof(Game));
if (outfile.fail())
std::cout << "write failed" << std::endl;
outfile.close();
std::cout << myGame->myMiner->getX(); //debug purposes : prints 25
}
问题似乎出在load函数中,因为从读取的对象的整数返回的值不正确。
void Game::LoadGame()
{
..some code..
std::string filename = GetLoadFilename(nameID); //works
std::ifstream infile;
infile.open(filename, std::ios::binary);
infile.read((char *)&myGame, sizeof(Game));
if (infile.fail())
{
std::cout << "read failed" << std::endl;
}
std::cout << myGame->myMiner->getX(); //debug purposes : prints -842150451
Play(myGame->myMiner->getX(), myGame->myMiner->getY());
}
课堂游戏:
class Game {
Game *myGame;
Miner *myMiner;
BlockTypes *myBlockTypes;
//Block* myBlocks[10000];
Consola *myConsole;
Mine *myMine;
int linhas, colunas;
int _currentStatus;
public:
..some functions such as load & save
};
加载时,始终显示“读取失败”消息,有什么不对?
答案 0 :(得分:1)
使用指针编写结构会写入指针的值,而不是指向对象的值。 你需要研究序列化。序列化是一种将数据结构化为连续非结构化介质(如硬盘驱动器)的方法。即,如何将您的信息结构化为一行位,这样您就可以从同一行位重建对象。之前链接的提升库是一个选项,但您还应该检查XML,JSON和other solutions。
答案 1 :(得分:0)
一般方法是使用“infile&gt;&gt; myGame”。在Game类中,定义运算符&lt;&lt;和运算符&gt;&gt;使用为您的Game类定制的版本覆盖默认值。
这些功能通常有一个&gt;&gt;列表或&lt;&lt;对于类的每个成员(如果没有定义运算符,则为默认值)。但是你需要做出一些决定并为指针类型成员编写一些代码。内存中对象的位置将从运行变为运行,因此您不能只保存和加载指针值。例如,可能在Game :: operator&lt;&lt;你需要调用&lt;&lt;在myMine上转储它(深层复制)。但也许Miner是指向一个单独保存和加载的数组的指针,所以Game :: operator&lt;&lt;保存矿工ID号或名称字符串和游戏运营商&gt;&gt;使用保存的数据查找Miner以获取指针。