只要塊的需求是你的而不是系統。
就像我說的,有幾種方法。函數指針至少需要樣板文件,但它們需要額外的參數來傳遞調用者的上下文(在您的案例中爲self
)。函數和指向成員的指針通常需要模板機制來工作,我們不要去那裏。因此,與函數指針,這裏是它如何去:
//Let's define a callback datatype
typedef void (*ResourceLoadObjFuncPtr)(void *, void*);
//argument 1 is ptr to ResourceLoadDescriptor, argument 2 is iconSlot, whatever it is
//Function that implements that type:
void MyLoad(void *img, void *iconSlot)
{
UIImage* img2 = (UIImage*)img;
UIImageView* iv = [[UIImageView alloc] initWithImage:img2];
iv.backgroundColor = [UIColor clearColor];
[(TheTypeOfIconslot*)iconSlot addSubview:iv];
iconLoaded(iv);
[iv release];
}
而且你不得不修改queueLoadImageWithBlock
原型接受ResourceLoadObjFuncPtr
參數,而不是ResourceLoadObjCBlockCB
,以及上下文(只是iconSlot
在其他參數我們的情況)。
和調用:
[[GameViewController getInstance] getResourceLoadMediator]->
queueLoadImageWithFunction([self.url UTF8String], MyLoad, self.iconSlot);
塊都是閉包 - 他們捕捉他們宣稱其中函數的變量。 C++不支持iOS上的GCC支持(除了塊以外)。所以你必須手動將函數範圍的變量傳遞給函數參數。在我們的情況下,如果我的假設是正確的,那麼只有一個變量;在更復雜的情況下,你必須將它們包裝在一個結構中,並將指針傳遞給一個結構。
另一種方法是使用抽象基類和通過其構造函數捕獲上下文的具體實現。這將是這樣的:
//Callback type
class ResourceLoader
{
public:
virtual void Load(void *) = 0;
};
//A callback implementation - not a function, but a class
class MyResourceLoader : public ResourceLoader
{
IconSlotType *iconSlot;
void Load(void *img)
{
//Same loader stuff as above
}
public:
MyResourceLoader(IconSlotType *isl)
:iconSlot(isl)
{}
};
的queueLoadImageWithBlock
相當於現在將採取ResourceLoader*
型的第二個參數,沒有第三個參數。至於invokation,存在回調對象生存期的問題。是queueLoadImageWithBlock
異步 - 也就是說,在調用回調之前它會返回嗎?如果是這樣,那麼MyResourceLoader的本地實例將不會執行,您必須動態創建一個並以某種方式處理它。假設它是同步的(。即不調用回調函數返回後):
MyResourceLoader ResLoader(self.iconSlot);
[[GameViewController getInstance] getResourceLoadMediator]->
queueLoadImageWithLoader([self.url UTF8String], &ResLoader);
如果不是的話:
[[GameViewController getInstance] getResourceLoadMediator]->
queueLoadImageWithLoader([self.url UTF8String], new MyResourceLoader(self.iconSlot));
C++世界呈現什麼樣的界面?在C++中,有三種不同的結構實現了「固定函數」的概念 - 有成員指針,函子和C風格函數指針。相關的Cocos2dx API期望哪一個? –
它應該是C++風格的函數指針或接近上面給出的代碼片段的東西。 – user1908860
是否提供'queueLoadImageWithBlock()'系統?如果是這樣,第二個參數的類型是什麼?如果它是一個塊,那麼用函數指針就無法滿足它。他們只是不相同。 –