gpt4 book ai didi

c++ - 无论如何要从他们的 vtable 重建一些保存的类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:15 25 4
gpt4 key购买 nike

我正在将一些对象复制到一个文件中,它们都派生自同一个类。但我希望能够在加载它们之后调用它们的函数来执行该类应该执行的操作,这是我到现在为止所做的:

#include <iostream>
#include <fstream>

using namespace std;

struct a
{
virtual void print()
{
cout << "this is a.\n";
};
};

struct b : public a
{
virtual void print()
{
cout << "this is b.\n";
}
};

int main()
{
ofstream testofile("test.bin",ios::binary);
a* tempa = new a;
a* tempb = new b;
testofile.write((char*)tempa,sizeof(a));
testofile.write((char*)tempb,sizeof(b));
testofile.flush();
testofile.close();
ifstream testifile("test.bin",ios::binary);
a* x = (a*)new char[max(sizeof(a),sizeof(b))];
testifile.read((char*)x,sizeof(a));
x->print();
testifile.read((char*)x,sizeof(b));
x->print();
}

我的示例工作正常,但如果我注释保存部分然后运行程序,则 vtable 似乎对新运行的应用程序无效(尽管我的代码中没有任何更改)。问题是我的文件管理器类不知道所有可能从我的基础对象派生的对象,我想重建我所有的应用程序结构,只使用一次调用文件管理器来加载它。当然,我的每个对象都有自己的保存/加载函数,但是文件管理器应该如何猜测适合当前数据 block 的加载函数在哪里?

最佳答案

请不要那样做。从来没有。

基本上,您所做的是使用旧式转换a* 转换为char*。这导致两个不相关类型之间的 reinterpret_cast静默,并且高度依赖于实现。您不能依赖底层内存布局:它可能因任何原因而改变(即使使用相同的编译器)。

如果您的类包含指针,您无法保证它们指向的数据在您重新加载类时仍然存在(或只是相同)。

如果你想提供一个序列化机制,创建你自己的serialize()deserialize()函数(它们甚至可以被模板化您可以专门化的函数,或者只是常规的成员函数,这并不重要。

当然,这需要更多的工作,但为了可靠性。此外,这样做,您可以优化数据表示以适应任何存储类型(保存到磁盘、发送到网络……),您甚至可以更改您的类接口(interface)并仍然保持与已经序列化的实例的兼容性。

关于c++ - 无论如何要从他们的 vtable 重建一些保存的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com