2013-04-03 19 views
0

是否有可能将一个对象的回调复制到另一个对象中?复制回调?

现在我正在处理一个数据结构的成员如下所示:

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(&copyObj, &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; 
    } 
} 

后来,在另一个文件不具有访问Caller.cpp但有访问SomeClass.h

#define VAR(V,init) __typeof(init) V=(init) 
#define FOR_EACH(I,C) for(VAR(I,(C).begin());I!=(C).end();I++) 

void Run() 
{ 
    FOR_EACH(o, vectorOfObjects) 
    { 
    Obj &b = *o; 
    r->callback(b, o->callback_data); 
    } 

    vectorOfObjects.clear(); 

    // repopulate vectorOfObject, might not be the same size as before. Could be bigger 
} 
+0

你不应该使用'memcpy'类对象。但是,您应该能够使用复制构造函数进行复制。如果没有明确定义,编译器将默认创建一个。 –

+0

@CodyGray:更确切地说,你不应该在非POD类型上使用'memcpy'(和他的朋友'malloc','realloc','strcpy','free')。 C结构也是类对象,但它们是POD。但确实,这是一个很好的经验法则(如果适用的话,我会尽可能称之为平均任务的良好实践)不要将这些函数用于任何对象。 –

+0

我遗漏了技术细节,因为没有理由在C++中对类对象使用'memcpy'。这不是关于C的问题(哎呀,你已经在编辑中发现了这个问题) –

回答

3

你的回调只是一个指针,所以简单地复制它有什么问题?

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; 
+1

嗯,我认为他想创建一个'Obj'的新实例......也许我误解了这个问题。 –

+0

当Obj的向量被清除时,当我尝试这个时,它似乎失去了回调。 – noko

+0

@noko如果上面的内容没有帮助,请发布清除向量的方法和创建新的'Obj'实例的部分。 –