有時我們需要在OC的程序中使用已有的C++類,這時,我們可以把OC類的.m文件后綴改為.mm,就可以在里面使用C++類了。但是二者直接混用會出現一些問題以致編譯無法通過,這時可以簡單的通過把target中的compile source as改為oc++就可以通過編譯。這是一個簡單的做法,但兩個世界確實很不一樣,如此這樣的深度混合有時會變地很棘手。
但是如果使用默認compile類型就在引入C++類后很可能會出錯,
錯誤通常是這樣的:
Unknown type name 'class'; did you mean 'Class'?
因為class CppObject根本不是有效的Objective-C語法, 所以編譯器就被搞糊塗了。正是因為Objective-C中沒有class這個關鍵字. 所以要與Objective-C兼容,Objective-C++類的頭文件必須僅包含Objective-C代碼,絕對沒有C++的代碼 - 這主要是影響類型定義。網上的文章已經提到一些解決方案.其中最好的一個是PIMPL,它也適用於現在的情況。這里還有一個適用於clang的新方法,可以將C++代碼從Objective-C中隔開,這就是class extensions中ivars的。
PIMPL:網上可以找到相關文章,簡單來說,就是把#import "CPPObject.h"改成@class CPPObject,就OK了。