"Могу ли я как-то создать объект target-C, который в своем конструкторе принимает указатель на функцию c ++ в качестве аргумента, который он вызывает позже?"
Да, но это довольно некрасиво.
Сначала определите базовый класс обратного вызова и шаблонную версию. Это может войти в общий файл .h, который можно #includ
редактировать из файлов .cpp и .mm. Также определите базовый класс CThread
:
// 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);
};
Затем поместите реализацию CThread
и его объект собеседника obj-c в файл .mm:
// 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];
}
};
А затем в файле cpp вашего приложения вы можете:
// 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));
}
};