Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我序列化C++对象,如何分配它的内存而不知道它是什么类型? 我已经序列化了C++对象,我希望分配它的空间,虽然我不能使用new运算符,因为我不知道对象的类。我尝试使用mallocsizeofobject,虽然尝试将指针类型转换为序列化对象的类型,但程序关闭了。有关对象类的信息存储在哪里 class object { public: virtual void somefunc(); int someint; }; class objectchild:public object { } object *o=(object*)malloc(sizeof(objectchild)); cout << int(dynamic_cast<objectchild*>(o)) << endl;_C++_Class_Serialization_Object - Fatal编程技术网

我序列化C++对象,如何分配它的内存而不知道它是什么类型? 我已经序列化了C++对象,我希望分配它的空间,虽然我不能使用new运算符,因为我不知道对象的类。我尝试使用mallocsizeofobject,虽然尝试将指针类型转换为序列化对象的类型,但程序关闭了。有关对象类的信息存储在哪里 class object { public: virtual void somefunc(); int someint; }; class objectchild:public object { } object *o=(object*)malloc(sizeof(objectchild)); cout << int(dynamic_cast<objectchild*>(o)) << endl;

我序列化C++对象,如何分配它的内存而不知道它是什么类型? 我已经序列化了C++对象,我希望分配它的空间,虽然我不能使用new运算符,因为我不知道对象的类。我尝试使用mallocsizeofobject,虽然尝试将指针类型转换为序列化对象的类型,但程序关闭了。有关对象类的信息存储在哪里 class object { public: virtual void somefunc(); int someint; }; class objectchild:public object { } object *o=(object*)malloc(sizeof(objectchild)); cout << int(dynamic_cast<objectchild*>(o)) << endl;,c++,class,serialization,object,C++,Class,Serialization,Object,这会导致程序关闭 预先感谢。 < P>不应混合C++和C内存路由。动态强制转换检查对象的实际类型。在您的情况下,您将原始内存强制转换为object*您需要以下代码 object *o = new objectchild; 使用动态\u强制转换。您试图动态\u强制转换一个内存位置,其中没有任何内容。malloc为您提供了放置对象的自由空间,但在调用新操作符之前,不存在任何对象,因此当dynamic_cast执行类型安全检查时,它将失败。你可以尝试使用StistalCype而不是DyrimCype

这会导致程序关闭


预先感谢。

< P>不应混合C++和C内存路由。动态强制转换检查对象的实际类型。在您的情况下,您将原始内存强制转换为object*

您需要以下代码

object *o = new objectchild;

使用动态\u强制转换。

您试图动态\u强制转换一个内存位置,其中没有任何内容。malloc为您提供了放置对象的自由空间,但在调用新操作符之前,不存在任何对象,因此当dynamic_cast执行类型安全检查时,它将失败。你可以尝试使用StistalCype而不是DyrimCype,因为静态不做类型安全检查,但是实际上你不应该混合C和C++的分配/转换样式。

< P>重写你的代码,这样你就可以从序列化的存档中以某种方式读取对象的类型。您可以通过字符串或使用的一些自定义值来实现这一点,但它可能不是通用的

例如,如果您正在编写一个CFoo对象,则首先流化值1。如果您正在编写CBar,则流式传输值2

然后,当读回归档文件时,如果你看到1,你就知道你必须新建一个CFoo,如果你看到2,你就知道你必须新建一个CBar

或者,您可以使用功能齐全的序列化库,或者将其作为灵感。 例如,我已经序列化了C++对象

我不确定你有没有。如果你写过这样的东西:

object *p = new objectchild();
some_file.write((char*)p, sizeof(objectchild));
那么您还没有序列化对象。您已经将一些数据写入文件,在大多数实现中,这些数据包括指向vtable的指针和类型信息。当您在另一台机器上或在同一程序的另一次运行中反序列化数据时,vtable通常不在同一地址,指针是无用的


<> P> C++中的对象序列化的唯一方法是以已知的格式编写数据成员。已知的格式应该包含足够的信息来计算对象的类型。有一些框架可以帮助您做到这一点,但与Java不同的是,语言或标准库中没有内置的机制。

为什么不在序列化中包含类型信息?我不理解您的担心,您知道它的objectchild,但仍然不想使用new,这很奇怪。我有一个对象在char*变量中序列化,我通过tcp/ip协议发送它,但我需要知道在另一端是什么对象,但我希望在每次添加新类时都不改变算法的情况下通用地这样做。。。我更愿意在没有任何附加库的情况下使用它。