#import <Foundation/Foundation.h>
#import <iostream> // 可以使用import来包含STL库头文件,但是此时不能自动处理重复包含,效果与include完全相同
class CppClass; // C++类按照C++类的声明来书写,所以这里不能写作@class,如果是声明OC类则需要写@class
@interface OCClass : NSObject /*不能让OCClass继承自std::string等C++类*/ {
CppClass *_cp; // 成员中可以定义指向C++对象的指针,但不能直接定义C++对象,并且该指针不能通过@property来自动生成getter和setter,需要手动书写
}
@property int men1;
- (void)show;
@end
class CppClass {
public:
int men;
OCClass *op; // 这里也可以定义指向OC对象的指针
CppClass(int men):men(men) { // 指向OC对象的指针无法写入初始化列表,因此不能将该指针声明为const成员
op = [[OCClass alloc] init]; // 只能在函数体中来初始化
}
friend std::ostream &operator <<(std::ostream &stream, CppClass &temp) {
NSLog(@"%d\t%@", temp.men, temp.op); // 可以调用Cocoa框架中的方法,但传参时只能传OC对象以及C语言的数据类型,不可以将C++对象(例如std::string)传入OC函数
return stream;
}
};
@implementation OCClass
- (NSString *)description {
return [NSString stringWithFormat:@"%d", self.men1];
}
- (instancetype)init {
if (self = [super init]) {
_cp = new CppClass(1); // 由于不能定义成员对象,只能定义指针,因此需要在初始化方法中使用new来创建C++对象
}
return self;
}
@end