我有一个具有此指针“SDL_Texture *纹理”的对象,当然还有一些其他不相关的属性和方法。我想将整个对象保存到文件中,然后在下一个 session 中重新加载它。
在使用它之前,我尝试加载它并重新分配纹理(这将指向错误的内存地址),但是当然我得到了完全错误的值。
这是代码:
class Entity
{
private:
SDL_Texture *texture = NULL;
// ...
public:
Entity::Entity(){}
void Entity::loadSprites()
{
this->texture = IMG_Load("./sprites/puppet/idle.png");
// ...
}
}
Entity load(const char filepath[])
{
Entity ent;
ifstream file(filepath);
file.read(reinterpret_cast<char*>(&ent), sizeof(Entity));
file.close();
ent.loadTexture();
return ent;
}
我知道加载错误指针的想法可能是我可以做的最糟糕的事情之一,但是我想知道这如何改变对象的每个属性的值,以及如何避免这种情况。
我还必须承认,我不太了解'reinterpret_cast(&ent)'是如何工作的。
最佳答案
您正在描述的问题与数据序列化有关。在此过程中,您将需要的所有数据写入数据流,以便稍后可以从该数据重建对象内部状态。您通常希望编写最少的数据。
有很多方法可以实现它:
save(std::ostream & data)
成员函数并定义构造函数:Entity(std::istream & data)
,根据从流中读取的数据构造对象。 无论如何,您都需要确定对象的数据格式,以便可以可靠地读取它。由于许多原因,仅通过fstream::write()/ read()将整个对象转储到磁盘是一个坏主意:
关于c++ - 在C++中,虽然它具有指针作为属性,但是有一种保存对象然后重新加载的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61030653/