2011-08-20 128 views
6

我有一個使用Boost/WXWidgets編寫的,針對Windows和Mac OSX的C++應用程序。但是,我遇到了一個我無法使用這些庫解決的問題。我的解決方案要求我包裝一個Objective C類,以便可以從我的一個C++模塊中調用它。迄今爲止,我的研究告訴我,我需要將Objective C++寫入源文件,擴展名爲.mm,允許XCode將該文件視爲Objective C和C++的混合體。我發現了大量的文章,詳細說明如何包裝C++,以便可以從ObjectiveC中調用它,但沒有任何相反的細節。任何鏈接到文章,或者更好的是,一個工作的例子,將不勝感激。在Objective C中包裝Objective C C++/C++

回答

2

只是混合它(但不要忘記設置池)。有用。

// obj-c code, in .mm file 
void functionContainingObjC(){ 
     NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
     [lots of brackets!]; 
     [pool release]; 
} 

// c++ code, in .cc file 
functionContainingObjC(); 
4

如果你想圍繞一個目標C類可重複使用的純C++包裝中,Pimpl idiom工作得很好。 Pimpl的習慣用法將使得在純C++代碼中包含的頭文件中沒有Objective C/Cocoa東西可見。

// FooWrapper.hpp 

// Absolutely no Cocoa includes or types here! 

class FooWrapper 
{ 
public: 
    int bar(); 

private: 
    struct Impl; // Forward declaration 
    Impl* impl; 
}; 


// FooWrapper.mm 

@import "FooWraper.hpp" 
@import "Foundation/NSFoo.h" 

struct FooWrapper::Impl 
{ 
    NSFoo* nsFoo; 
}; 

FooWrapper::FooWrapper() : impl(new Impl) 
{ 
    impl->nsFoo = [[NSFoo alloc] init]; 
} 

FooWrapper::~FooWrapper() 
{ 
    [impl->nsFoo release]; 
    delete impl; 
} 

int FooWrapper::bar() 
{ 
    return [impl->nsFoo getInteger]; 
} 
1

objc提供I2C接口的基本接口和類型(#include <objc/headers_you_need.h>。因此,可以在純C使用這些接口/ C++的TU。然後包括在毫米等基金會或了AppKit庫和使用objc類型和消息在執行中

以下是一個非基本的接口,它不是類型安全的,但是我鼓勵你爲它所包裝的objc類型設置類型安全性,這應該足以讓你開始朝着正確的方向發展

// .hpp 
namespace MON { 
// could be an auto pointer or a dumb pointer; depending on your needs 
    class t_MONSubclassWrapper { 
    public: 
// usual stuff here... 

// example wrapper usage: 
     void release(); 
    private: 
     id d_objcInstance; 
    }; 
} /* << MON */ 

// .mm 
... 
#include <Foundation/Foundation.h> 

MON::t_MONSubclassWrapper::t_MONSubclassWrapper() : 
    d_objcInstance([[MONSubclass alloc] init]) { 
} 
... 
void MON::t_MONSubclassWrapper::release() { 
    [d_objcInstance release]; 
}