Eon*_*nil 7 c++ objective-c mixing objective-c++
我正在混合Objective-C和C++.但是我想尽量减少使用Objective-C++.因为它在Objective-C和C++中都有某种限制.
目前,我正在使用它.
// A.h, Objective-C
#import "B.h"
@interface A
{
B* b;
}
@end
// B.h, Objective-C++
@interface B
{
void* c;
}
// C.h, C++
class C
{
};
Run Code Online (Sandbox Code Playgroud)
我想包括C.h在B.h,但如果我做到了,B.h不能被导入A.h.所以我必须将变量保留c为void*类型.这不是一个大问题,因为我可以使用的成员C在B.m文件中自由活动.但我总是要施展它.这感觉不清楚.所以如果是的话,我想用更好的方法.
pmd*_*mdj 15
有几种方法可以做到这一点,但在我看来,最好的方法是使用'PIMPL'习惯用法,这在C++中很常见.使标头纯粹是Objective-C和纯C++,带有指向包含实际实现的前向声明结构的指针.这是在.mm文件中定义的,然后可以使用Objective-C++.
在您的示例中,您将执行以下操作:
// B.h, pure Objective-C:
struct BImpl;
@interface B
{
struct BImpl* impl;
}
// ...
// B.mm, mixed:
#include "C.h"
struct BImpl // since this is C++, it can actually have constructors/destructors
{
C* my_c;
BImpl() : my_c(new C) {}
~BImpl() { delete my_c; my_c = NULL; }
};
// make sure to alloc/initialise impl (using new) in B's init* methods,
// and free it (using delete) in the dealloc method.
Run Code Online (Sandbox Code Playgroud)
其实我已经写在正好解决这个问题的文章,你可能会发现它有用:http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects -这也显示了一些其他这样做的方法,包括你原来的void*方法.
| 归档时间: |
|
| 查看次数: |
5743 次 |
| 最近记录: |