2011-08-20 76 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]; 
}