2013-04-03 20 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'實例的部分。 –