#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