0

我希望能夠爲我正在開發的項目提供一些幫助。我目前正在嘗試將以Objective-c編寫的代碼https://github.com/djwait/CoreBluetoothExample修改爲Openframeworks ios Objective C++。然而,我是Objective-c的完整初學者,並且對於如何繼續進行感到迷茫。目標是訪問變量uint16_t heartRate(來自原始應用程序)並在C++代碼中使用它。比任何事情都困惑,原始代碼是如何創建一個ACViewController對象,以及如何調用其成員函數。 我目前的方法是將原始ACViewController .h複製到我的新項目中。然後在我的ofApp.h中導入ACViewController.h,創建一個類: ACViewController * acv;如何將corebluetooth從Objective C移植到Objective C++

然後在setup中:acv = [[ACViewController alloc] init]; 但是,每當我嘗試調用一個函數,如[acv renderHeartRateMeasurement];我得到 實例方法'-renderHeartRateMeasurement'找不到(返回類型默認爲'id')

任何幫助將不勝感激!

最佳, 古斯塔夫

回答

0

如果我理解正確的話,你希望能夠從C調用的Objective-C++方法。

讓我們假設你有MyClass.h定義的Objective-C類,如下所示:

@interface MyClass : NSObject 
-(instancetype)initWithA:(int)a andB:(int)b; 
@end 

一個非常簡單的類,與需要兩個整數一個init。

從C++訪問它,你會做你的MyCppClass.hpp如下:

#include <objc/objc-runtime.h> 
#ifdef __OBJC__ 
#define OBJC_CLASS(name) @class name // if imported in ObjC it knows it is a class 
#else 
#define OBJC_CLASS(name) typedef struct objc_object name // C++ will treat it as a struct, which is what an ObjC class is internally 
#endif 

OBJC_CLASS(MyClass); 

namespace MyWrapper { 
class MyCppClass { 
    MyClass* myObj; 
public: 
    MyCppClass(int a, int b); 
    ~MyCppClass(); 
}; 
} 

如果你的C++代碼調用ObjC類/方法那麼ObjC運行時必須是可用的。宏允許在C++代碼中向前聲明ObjC類,並且它會編譯並運行得很好。 C++不會抱怨。只需在您的C++文件中包含MyCppClass.hpp,並像使用任何C++類一樣使用它。

現在最後一步是在你的MyCppClass.mm,這是一個Objective-C++文件中定義如下:

#include "MyCppClass.hpp" 
#import "MyClass.h" // this is your ObjC class, imported here because you can't import it in C++ header 

namespace MyWrapper { 
MyCppClass::MyCppClass(int a, int b) : 
myObj([[MyClass alloc] initWithA:a andB:b]) { } 

MyCppClass::~ MyCppClass() { 
    [myObj release]; 
} 

最後一個音符,MyCppClass.mm需要與編譯-fno-編譯objc-arc標誌