c++ - 在C++中,虽然它具有指针作为属性,但是有一种保存对象然后重新加载的方法吗?

标签 c++ pointers ifstream

我有一个具有此指针“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),根据从流中读取的数据构造对象。
  • 使用诸如boost::serialization之类的序列化库(非常通用,可以(反)序列化任何东西)

  • 无论如何,您都需要确定对象的数据格式,以便可以可靠地读取它。由于许多原因,仅通过fstream::write()/ read()将整个对象转储到磁盘是一个坏主意:
  • 对象可能包含某些无法保存的指针,例如vtable。它们固定在构造函数中。
  • 如果在转储数据后类以任何方式发生更改,它将使所有已保存的数据无用。
  • 将任何数据地址值写入文件都是错误的:下次运行程序时,它们无效。任何指向数据的指针都需要序列化(数据本身,而不是指针!)
  • 序列化通常是一个递归过程。例如boost::serialization处理此问题,以便您可以序列化诸如对象容器之类的东西。 (如std::list)
  • 关于c++ - 在C++中,虽然它具有指针作为属性,但是有一种保存对象然后重新加载的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61030653/

    相关文章:

    c - C 中的变量指针

    C++ 从文本文件创建对象

    c++ - OpenCV检测运动

    c - 将指针传递给 scanf() 会产生段错误

    c++ - 为什么自建的 g++ 编译器无法编译我的代码

    c++ - for 循环未运行,试图向后遍历数组元素

    c++ - 读/写 PPM 图像文件 C++

    C++ : How to skip first whitespace while using getline() with ifstream object to read a line from a file?

    c++ - 部分模板特化错误

    c++ - 在 C++ 中使用 MessagePack 反序列化异构映射