- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我正在使用 boost::serialization 库,并且我试图覆盖类的构造方式,因为它没有默认构造函数。这是 demonstrated here .在我看来,该函数采用 class* t
然后将其设置为指向新构造的对象。如果我错了,这绝对是我错误的根源。
但是,构造我的类的唯一方法是使用另一个类的 create()
函数,这意味着我需要偏离示例中的代码(这在 boost 中说明::序列化命名空间): ::new(t)my_class(attribute);
我尝试简单地调用创建函数并将 t
设置为返回的指针,但这似乎不起作用,因为紧接在 load_construct_data 函数
之后,并且在序列化函数
,给定的 myClass&
与我设置的“t”不同。
无论::new(t) 正在做什么,我该怎么做才能使使用 create 函数创建的对象跟随到序列化/其他函数中?
最佳答案
您的问题 (new(t) my_class(attribute)
) 中提到的构造称为“placement new”。它的工作方式是这样的
t
必须已经指向已分配的内存区域(placement new 默认不进行分配)my_class
的实例。但是,由于在您的情况下您不能使用构造函数,因此使用任何形式的 new
都是不可能的。但还有另一种选择(某种程度上)。
由于 placement new 几乎只是覆盖一 block 内存,我们可以使用一个常规函数来对已经构造的对象执行相同的操作。这样的函数是memcpy
:
void * memcpy ( void * destination, const void * source, size_t num );
所有 memcpy
所做的就是执行 num
字节的逐字节复制,从 source
指向的内存到目的地
。
假设您开始使用 load_construct_data
中的这段代码
my_class obj = other_class::create();
然后我们可以使用memcpy
函数将obj
处的值“移动”到t
的内存引用中:
memcpy((void*)t, (void*)(&obj), sizeof(obj));
虽然有一些关于它如何与您的特定类一起工作的详细信息,例如按位复制是否“足够好”,但这是我对您所要求的最好的。我看到的一个问题是,如果析构函数释放资源,那么拷贝可能会变得无效。
为了解决销毁可能出现的问题,您可以编写自己的深度复制函数:
void deepCopy( my_class * destination, const my_class * source );
你调用它而不是 memcpy
。
注意:如果我在这里误入歧途,请告诉我。我目前没有用于测试代码的机器。
关于c++ - boost::serialization: 重载 load_construct_data: 根本没有可访问的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7050145/
我为没有默认构造函数的类(boost::serialization::save_construct_data)实现了一对boost::serialization::load_construct_dat
所以我正在使用 boost::serialization 库,并且我试图覆盖类的构造方式,因为它没有默认构造函数。这是 demonstrated here .在我看来,该函数采用 class* t 然
我尝试在 boost 的帮助下使用非默认构造函数序列化派生指针类。 在编译过程中出现错误: Derived.h: In function ‘void boost::serialization::loa
我是一名优秀的程序员,十分优秀!