“我可以以某种方式创建一个客观的C对象,在它的构造函数中,它将一个C++函数指针作为它后来调用的参数?”
是的,但它相当丑陋。
首先,定义一个回调基类和一个模板版本。这可以进入一个通用的.h文件,该文件可以是来自.cpp和.mm文件的#includ
。还定义了基本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
,它的对象 - 哥们对象,在。毫米文件:
// 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));
}
};
你并不需要传递的自我,你可以通过任何Objective-C的对象。 – 2011-01-21 20:13:01
所以它意味着我不能将threadMain函数定义为我的C++对象的成员函数? – Mat 2011-01-21 20:15:10
不,但是你可以制作一个虚拟的objective-c对象,用你的C++对象进行初始化,然后调用你回来 – 2011-01-21 20:19:47