如何在Objective C++标头中包含C++标头?

fat*_*cat 12 c++ import include objective-c++ ios

我有一个.cpp/.hpp文件组合 - > .hpp文件有#include ..

我也有一个.mm/.h文件组合 - >如果我在.mm目标C++文件中包含.hpp文件,则没有问题.但是,如果我尝试在.h(Objective C标头)文件中包含.hpp文件,我会收到预处理器问题'找不到iostream'.

除了做一些时髦的东西,比如在我的Objective C .h文件中有一个void*然后把它作为包含在.mm中的类型或者包装在Objective C++类型中的每个C++类型之外,还有什么方法吗?

我的问题与托尼的问题基本相同(但没有人回答他):

/sf/ask/711432571/

Joe*_*Joe 20

问题是您必须避免标头中的所有C++语义,以允许普通的Objective-C类包含它.这可以使用不透明指针来完成.

CPPClass.h

class CPPClass
{
public:
    int getNumber()
    {
        return 10;
    }
};
Run Code Online (Sandbox Code Playgroud)

ObjCPP.h

//Forward declare struct
struct CPPMembers;

@interface ObjCPP : NSObject
{
    //opaque pointer to store cpp members
    struct CPPMembers *_cppMembers;
}

@end
Run Code Online (Sandbox Code Playgroud)

ObjCPP.mm

#import "ObjCPP.h"
#import "CPPClass.h"

struct CPPMembers {
    CPPClass member1;
};

@implementation ObjCPP

- (id)init
{
    self = [super init];
    if (self) {
        //Allocate storage for members
        _cppMembers = new CPPMembers;

        //usage
        NSLog(@"%d", _cppMembers->member1.getNumber());
    }

    return self;
}

- (void)dealloc
{
    //Free members even if ARC.
    delete _cppMembers;

    //If not ARC uncomment the following line
    //[super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)