Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++_Callback_Scope - Fatal编程技术网

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特别是在问题更新之后,我的(先前更新的)答案应该会有所帮助。