【问题标题】:Casting an Object to char* for saving/loading将对象转换为 char* 以进行保存/加载
【发布时间】:2011-06-30 15:35:51
【问题描述】:

我有一个小问题。

我正在编写一个加载/保存函数,用于从保存的文件中获取纯几何数据。涉及的对象是从包含大量数据的类中实例化的,但它们都只使用普通的旧数据,没有指针/分配的内存等。

是否可以将文件加载到分配的 char* 数组中,将其类型转换为 Geometry* ,并且假设我在保存时做了同样相反的事情(将数组类型转换为 char*并将其写入文件)?

如果我尝试访问由 char* 指针、int* 或任何其他指针类型指向的数组,是否需要特别注意?

【问题讨论】:

    标签: c++ class pointers casting


    【解决方案1】:

    是否可以将文件加载到 分配的 char* 数组,类型转换 比如说几何*

    这是可能的。我做过类似的工作。我使用了两个链接的static_cast 来执行此操作,如:

    char *buffer;
    //..
    Geometry *g = static_cast<Geometry *>(static_cast<void*>(buffer));
    
    //reverse
    buffer = static_cast<char*>(static_cast<void*>(g));
    

    由于两个链接的static_cast看起来很麻烦,所以我写了这个函数模板:

    template<class To, class From>
    To any_cast(From v)
    {
        return static_cast<To>(static_cast<void*>(v));
    }
    

    然后用它作为,

    Geometry *g = any_cast<Geometry *>(buffer);
    
    //reverse
    buffer = any_cast<char*>(g);
    

    看到这个话题:

    Why do we have reinterpret_cast in C++ when two chained static_cast can do its job?

    【讨论】:

    • 哦,谢谢!我总是只使用通用的“(Geometry*)buffer;”事物。我将不得不查看 static_cast 的不同之处。但是为什么需要静态转换为 void* ..?
    • @Clairvoire:这个是必须的,否则编译不出来!
    【解决方案2】:

    您可以将 POD 对象数组(不包含指针)作为字节写出,然后将它们读回。您建议的强制转换可以做到这一点;您需要使用char* 而不是int* 以避免基于类型的别名分析出现问题。但是,您需要在具有与用于写出它们的机器相同的字长、字节序和结构布局的系统上读取它们。

    【讨论】:

    • 字节序,我认为这可能会导致带有 2 个或 4 个单词的变量将它们反转?没想到,很高兴你提出来!
    • @Clairvoire:是的,这可能会导致事情发生逆转。不同的填充和字长也会导致问题。如果您关心这些事情,请使用序列化库。
    【解决方案3】:

    考虑使用库进行序列化,例如protobuf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-21
      • 2013-05-02
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2022-12-22
      相关资源
      最近更新 更多