建议将C++类用于Objective-C类,尽量减少使用Objective-C++?

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.hB.h,但如果我做到了,B.h不能被导入A.h.所以我必须将变量保留cvoid*类型.这不是一个大问题,因为我可以使用的成员CB.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*方法.

  • 我不能等待剩余4分钟选择这个作为答案! (4认同)