将objective-c类包装到c ++类中:最佳实践?

时间:2014-10-01 13:27:33

标签: c++ objective-c wrapper

我有一个在objective-c ++(。mm)文件中实现的c ++类。 该类包含一些Cocoa对象,比如NSToolbar,作为(私有)成员变量。 该类应该作为纯c ++接口公开,并且可以由纯c ++客户端使用。 换句话说,我试图在一个c ++类中包装obj-c对象。

我想到的第一件事就是在类接口中使用void指针 然后,只要_toolbar需要被视为NSToolbar,就可以在类实现中进行强制转换。

例如,我有接口:

// NSToolbarWrapper.h
class NSToolbarWrapper {
private:
void * _toolbar;

//... rest of the class ...

}

和实施:

// NSToolbarWrapper.mm
...
ToolbarWrapper::ToolbarWrapper (...){
_toolbar = (__bridge void *)[[NSToolbar alloc] initWithIdentifier:@"My toolbar!"];
...
}

我不确定这是最聪明的方法。 在这种情况下是否有最佳做法?

2 个答案:

答案 0 :(得分:3)

Pimpl习惯用c ++接口和客观c ++实现。 如果你使用unique_ptr作为你的pimpl,你需要声明你的析构函数并在.mm文件中定义它。

class.h:

class myclass {
    class impl;
    std::unique_ptr<impl> _impl; // or shared_ptr if you want shared handle behaviour

public:
    myclass(const char* s);
    ~myclass(); // only declare here
};

class.mm:

class myclass::impl {
    NSString* _str;
public:
    impl(const char* s) 
    : _str([NSString stringWithCString:s encoding: NSASCIIStringEncoding]) 
    {}
};

myclass::myclass(const char* s)
: _impl(new impl(s))
{}

myclass::~myclass() = default;  // define here

答案 1 :(得分:0)

为了记录,并在将来提醒自己。

我见过一个非常着名的开源库,这样做似乎也是一种有效的方法:

// NSToolbarWrapper.h
#ifdef __OBJC__
typedef NSToolbar *Toolbar;
#else
typedef class NSToolbar_opaque *Toolbar;
#endif // __OBJC__

class NSToolbarWrapper {
private:
Toolbar _toolbar;

//... rest of the class ...

}