我的实际问题在下面的粗体字中,但这是我的问题所在:
我正在尝试使用Boost :: serialization来保存和恢复玩家的状态。我在http://www.boost.org/doc/libs/1_56_0/libs/serialization/doc/tutorial.html#simplecase中阅读了该教程,但不确定如何
boost::archive::text_iarchive
作品。
我正在假设以下几行
boost::archive::text_iarchive inArchive(playerfile);
inArchive >> target;
将根据播放器文件的相应文本文件初始化目标?
我在假设的情况下编写了以下函数:
bool SavePlayerState(Player *target)
{
std::string fileName = (target->name) + ".playerfile";
std::ofstream playerfile(fileName);
if(!playerfile.is_open())
{
s_al_show_native_message_box(display, "SAVE FAILURE", "SAVE FAILURE", fileName + "could not be created/opened.",
NULL, ALLEGRO_MESSAGEBOX_ERROR);
return false;
}
boost::archive::text_oarchive outArchive(playerfile);
outArchive << target;
return true;
}
bool LoadPlayerState(std::string playerName, Player *target)
{
std::string fileName = playerName + ".playerfile";
std::ifstream playerfile(fileName);
if(!playerfile.is_open())
{
s_al_show_native_message_box(display, "LOAD FAILURE", "LOAD FAILURE", fileName + "could not be found/opened.",
NULL, ALLEGRO_MESSAGEBOX_ERROR);
return false;
}
boost::archive::text_iarchive inArchive(playerfile);
inArchive >> target;
return true;
}
为了测试目的,它们在main()中被调用:
int main(int argc, char *argv[])
{
//...
player = new Player(5,5); // There is a Player*player; declared elsewhere
LoadPlayerState("player", player); //Load the file with this name, target is player object
beings.push_back(player);
//The game's operations...
SavePlayerState(player);
delete player;
//...
return 0;
}
SavePlayerState(player); 可以正常工作,并且我发现目录中已经创建了player.playerfile。但是LoadPlayerState(“ player”,player); 给我以下错误:
C:\Development\Libraries\boost\boost\serialization\access.hpp|132|error: no matching function for call to 'Player::Player()'|
我不知道为什么构造函数应该有问题,或者为什么Save可以工作而不是Load。我不是在尝试创建新的Player对象,而是根据存档来调整现有目标Player的形状。为了使这项工作有效,我需要更改什么?
我的球员班:
#ifndef PLAYER_H_INCLUDED
#define PLAYER_H_INCLUDED
#include "being.h"
#include "extfile.h"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/vector.hpp>
class Player: public Being
{
friend class boost::serialization::access;
template<class PlayerArchive>
void serialize(PlayerArchive & par, const unsigned int version)
{
par & boost::serialization::base_object<Being>(*this);
par & active;
//par & various things
}
public:
Player(bool savedPlayer);
Player(int spawnXCell, int spawnYCell);
~Player();
//Functions
};
//Prototype to the save and Load state functions mentioned previously are found here.
#endif // PLAYER_H_INCLUDED
如果有帮助,这是我完整的构建消息日志:
> || ===构建:在Roguelike中进行调试(编译器:GNU GCC编译器)=== | > C:\ Development \ Libraries \ boost \ boost \ serialization \ access.hpp ||实例化为“静态void boost :: serialization :: access :: construct(T *)[with T = Player]”:| > C:\ Development \ Libraries \ boost \ boost \ serialization \ serialization.hpp | 93 |要求来自'void boost :: serialization :: load_construct_data(Archive&,T *,unsigned int)[with Archive = boost :: archive :: text_iarchive; T =玩家]'| > C:\ Development \ Libraries \ boost \ boost \ serialization \ serialization.hpp | 158 |要求来自'void boost :: serialization :: load_construct_data_adl(Archive&,T *,unsigned int)[with Archive = boost :: archive :: text_iarchive; T =玩家]'| > C:\ Development \ Libraries \ boost \ boost \ archive \ detail \ iserializer.hpp | 341 |从'void boost :: archive :: detail :: pointer_iserializer :: load_object_ptr(boost :: archive :: detail :: basic_iarchive& ,void *,unsigned int)const [with Archive = boost :: archive :: text_iarchive; T =玩家]'| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.cpp | 76 |从此处要求| > C:\ Development \ Libraries \ boost \ boost \ serialization \ access.hpp | 132 |错误:没有匹配的函数调用'Player :: Player()'| > C:\ Development \ Libraries \ boost \ boost \ serialization \ access.hpp | 132 |注意:候选对象为:| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.cpp | 8 |注:Player :: Player(int,int)| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.cpp | 8 |注意:候选人需要2个参数,提供了0个| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.cpp | 3 |注:Player :: Player(bool)| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.cpp | 3 |注:候选人期望1个参数,提供0个| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.h | 12 |注意:Player :: Player(const Player&)| > C:\ Development \ Projects \ Roguelike \ Roguelike \ player.h | 12 |注意:候选人期望1个参数,提供0个| || ===构建失败:1个错误,5个警告(0分钟,4秒)=== |
非常感谢。如果需要任何其他信息,我将在后面附加。
错误消息非常清楚:
没有匹配的函数来调用'Player :: Player()'
您的类中必须具有默认构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句