繁体   English   中英

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

[英]Recommended way to use C++ class into Objective-C class minimizing using of 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
{
};

我想在Bh包含Ch ,但如果我这样做, Bh就无法导入到Ah 所以我必须将变量c保留为void*类型。 这不是一个大问题,因为我可以自由地使用Bm文件中的C成员。 但我总是要施展它。 这感觉不清楚。 所以如果是的话,我想用更好的方法。

有几种方法可以做到这一点,但在我看来,最好的方法是使用'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.

我实际上写了一篇关于解决这个问题的文章,你可能会发现它很有用: http//philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects - 它还显示了其他一些这样做的方法,包括你原来的void*方法。

正如pmjordan在他的博客文章中所写,@ interface声明中的BImpl需要'struct'关键字,如下所示。

struct BImpl;
@interface B
{
    struct BImpl* impl;
}

我认为他无意中把它排除在外。 如果您在拥有大量* .m文件时需要包含此标头,这会产生巨大的差异。 添加的'struct'关键字使Objective-C编译器将此标头理解为导入此标头的其他.m文件的纯C。 否则,将不会编译导入此标头的其他* .m文件。 这个小巧的解决方案可以帮助您将* .m文件更改为.mm文件。 有时,将原始.m文件更改为.mm会导致大量编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM