"est-ce que je peux en quelque sorte créer un objet objectif-C qui - dans son constructeur - prend un pointeur de fonction C++ comme argument qu'il appellera plus tard?"
Oui, mais c'est plutôt moche.
D'abord, définissez un baseclass de rappel et une version basée sur un modèle. Cela peut aller dans un fichier générique .h qui peut être #includ
éd à partir de fichiers .cpp et .mm. définir également une classe CThread
de base:
// Thread.h
#pragma once
#include <objc/objc.h> // for a cpp compatible definition of id
class Callback{
public:
virtual void operator()(void)=0;
};
template<class T>
class ClassCallback : public Callback {
T* _classPtr;
typedef void(T::*fncb)(void);
fncb _cbProc;
public:
ClassCallback(T* classPtr,fncb cbProc):_classPtr(classPtr),_cbProc(cbProc){}
virtual void operator()(void){
(_classPtr->*_cbProc)();
}
};
class CThread {
id _thread;
public:
void Start(Callback* cb);
};
Ensuite, mettre la mise en œuvre de CThread
, et son objet copain obj-c, dans un.mm fichier:
// Thread.mm
#import <Cocoa/Cocoa.h>
#import "Thread.h"
@interface ThreadStarter:NSObject
{
Callback *theCallback;
}
-(void)Run;
-(id)init:(Callback*)cb;
@end
@implementation ThreadStarter
-(id)init:(Callback*)cb
{
theCallback = cb;
return [super init];
}
-(void)Run
{
theCallback();
}
@end
void CThread::Start(Callback* cb){
_thread = [[ThreadStarter alloc] init:cb];
[NSThread detachNewThreadSelector:@selector(Run)
toTarget:_thread
withObject:nil];
}
};
Et puis, dans le fichier cpp de votre application, vous pouvez:
// MyClass.cpp (doesn't even have to be .mm)
#include "Thread.h"
class MyClass {
CThread _myThread;
void SomeArbMethod(){
}
public:
MyClass(){
_myThread.Start(new ClassCallback<MyClass>(this,&MyClass::SomeArbMethod));
}
};
Vous n'avez pas besoin de passer soi-même, vous pouvez passer un objet-c objectif. –
cela signifie que je ne peux pas avoir la fonction threadMain être définie comme une fonction de membre de mon objet C++? – Mat
non, mais vous pouvez créer un objet objectif-c factice que vous initialisez avec votre objet C++, qui vous rappelle –