gpt4 book ai didi

c++ - 将 objective-c 类包装到 c++ 类 : best practices?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:52 24 4
gpt4 key购买 nike

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

我首先想到的是在类接口(interface)中使用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!"];
...
}

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

最佳答案

具有 C++ 接口(interface)和 Objective-C++ 实现的 Pimpl 习语。如果使用 unique_ptr 作为 pimpl,则需要声明析构函数并在 .mm 文件中定义它;

类.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
};

类.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

关于c++ - 将 objective-c 类包装到 c++ 类 : best practices?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com