C++ 复制回叫?
是否可以将一个对象的回调复制到另一个对象中 现在,我正在处理一个具有如下成员的数据结构:C++ 复制回叫?,c++,callback,scope,C++,Callback,Scope,是否可以将一个对象的回调复制到另一个对象中 现在,我正在处理一个具有如下成员的数据结构: class Obj { // some unrelated variables // some unrelated functions void (*callback)(Obj& r, void* user); void* callback_data; } o->callback = AFunctionInAnotherScope; 回调的分配方式如下所示: class O
class Obj
{
// some unrelated variables
// some unrelated functions
void (*callback)(Obj& r, void* user);
void* callback_data;
}
o->callback = AFunctionInAnotherScope;
回调的分配方式如下所示:
class Obj
{
// some unrelated variables
// some unrelated functions
void (*callback)(Obj& r, void* user);
void* callback_data;
}
o->callback = AFunctionInAnotherScope;
保留Obj
的向量,但每次迭代都必须对该向量调用clear()
回调函数位于另一个作用域中,该作用域也分配回调
当前作用域没有访问回调函数的权限,但我想创建新的Obj并为它们分配相同的回调。有办法做到这一点吗
e:到目前为止,我已经尝试使用memcpy(©Obj,&vectorOfObj.at(0),sizeof(Obj))但是我认为我没有正确地使用它
提前谢谢
更新:以下是创建Obj的文件的外观:
Caller.cpp
#include "SomeClass.h"
void Callback(Obj& r, void* dummy_data)
{
// do things
}
int main( int argc, char* argv[] )
{
for(int i = 0; i < SomeClass::vectorOfOBj.size(); ++i)
{
vectorOfObj.at(i).callback = Callback;
}
}
您的回调只是一个指针,那么简单地复制它有什么错呢
copyObj.callback = vectorOfObj.at(0).callback;
在您的情况下,可能只需在清除向量之前存储指针:
typedef void (*callback_t)(Obj& r, void* user);
callback_t cb = vectorOfObj.at(0).callback;
vectorOfObj.clear();
// later...
Obj o;
o.callback = cb;
您的回调只是一个指针,那么简单地复制它有什么错呢
copyObj.callback = vectorOfObj.at(0).callback;
在您的情况下,可能只需在清除向量之前存储指针:
typedef void (*callback_t)(Obj& r, void* user);
callback_t cb = vectorOfObj.at(0).callback;
vectorOfObj.clear();
// later...
Obj o;
o.callback = cb;
类对象不应使用memcpy
。但是,您应该能够使用复制构造函数进行复制。如果您没有明确定义,编译器将默认创建一个。@CodyGray:更准确地说,您不应该在非POD类型上使用memcpy
(和他的朋友malloc
,realloc
,strcpy
,free
)。C结构也是类对象,但它们是POD。但实际上,这是一个很好的经验法则(我会一直称之为平均任务的好实践),如果不适用,不要调用这些函数,我忽略了技术细节,因为在C++中没有任何理由在类对象上使用<代码> MycPy < /Cl>。这不是关于C的问题(哎呀,你已经在编辑中看到了),你不应该对类对象使用memcpy
。但是,您应该能够使用复制构造函数进行复制。如果您没有明确定义,编译器将默认创建一个。@CodyGray:更准确地说,您不应该在非POD类型上使用memcpy
(和他的朋友malloc
,realloc
,strcpy
,free
)。C结构也是类对象,但它们是POD。但实际上,这是一个很好的经验法则(我会一直称之为平均任务的好实践),如果不适用,不要调用这些函数,我忽略了技术细节,因为在C++中没有任何理由在类对象上使用<代码> MycPy < /Cl>。这不是关于C的问题。(哎呀,你已经在编辑中看到了)嗯,我假设他想创建一个新的Obj
。。。也许我看错了问题。当Obj的向量被清除时,我尝试此操作时,它似乎失去了回调。@noko如果上述方法没有帮助,请发布清除向量的方法以及创建新的Obj
实例的部分。@DanielFrey感谢您的回答,但仍然有问题。我已经用更多信息更新了我的问题。@noko特别是在问题更新之后,我的(先前更新的)答案应该会有所帮助。嗯,我假设他想创建一个新的Obj
。。。也许我看错了问题。当Obj的向量被清除时,我尝试此操作时,它似乎失去了回调。@noko如果上述方法没有帮助,请发布清除向量的方法以及创建新的Obj
实例的部分。@DanielFrey感谢您的回答,但仍然有问题。我已经用更多信息更新了我的问题。@noko特别是在问题更新之后,我的(先前更新的)答案应该会有所帮助。