oc与c++混编,抛弃.mm文件

写这片文章的起因是,有些朋友不想使用oc++的全部.mm文件的写法,固才有这种混编的转化的方法前期准备:

  1. 首先建立一个新工程,编译,运行,ok 没问题,进入第2步
  2. 我建立了一个 "COCFile.m" 的文件,用来储存oc语言的代码,代码如下:

"COCFile.h"

#import <Foundation/Foundation.h> 

@interface COCFile : NSObject{    

 NSString  * name_;    
 NSNumber  * count_;
}

@property (nonatomic, readwrite,copy) NSString  * name_;
@property (nonatomic, readwrite,retain) NSNumber  * count_;
@end

"COCFile.m"

#import "COCFile.h"
@implementation COCFile
@synthesize name_;
@synthesize count_;

-(id) init{
   if(self = [super init])    {        
        name_ = @"text";        
       count_ = [NSNumber numberWithInt:3];    
   }
   return self;
}
@end

编译,测试没问题,我们进入下一步

state_1: 头文件内不包含oc 语言的混编

  1. 我们建立一个 "COCFile_State_1.cpp" 的中转类,将尾缀修改为".mm ".并将头文件放到 "HelloWorldScene.m"中,编译测试。没问题,下一步。
  2. 在 "COCFile_State_1”创建一个c++的类,你可以选择用普通或者是单例都没问题.那么我们需要在这个类中调用 "COCFile" 的oc的代码,代码如下

"COCFile_State_1.h"

  #include <iostream>
  #include "CSingleton.h"
  class CState_1 : public Singleton
  {
   public:
    const char * getName();    
    int getCount();
    const char *  getMode();
  };

"COCFile_State_1.mm"

  #import "COCFile.h"
  #include "COCFile_State_1.h"

  const char * CState_1::getName(){ 
      COCFile * file = [[[COCFile alloc]init]autorelease]; 
      return [file.name_ UTF8String];
  }

  int CState_1::getCount(){
      COCFile * file = [[[COCFile alloc]init]autorelease];
      return [file.count_ intValue];
  }

  const char *  CState_1::getMode(){
      return [[UIDevice currentDevice].model UTF8String];
  }
  1. 这样就可以在"HelloWorldScene"中调用这2个方法来获取原来在oc中的数据了.代码如下:
const char * name = CState_1::getInstance()->getName();
 int count = CState_1::getInstance()->getCount();
 const char * mode = CState_1::getInstance()->getMode();
 CCLOG("name = %s",name);
 CCLOG("count = %d",count);
 CCLOG("mode = %s",mode);


 输出如下:
 Cocos2d: name = text
 Cocos2d: count = 3
 Cocos2d: mode = iPhone Simulator

备注:这里举的例子可能不够恰当(主要是跟state2做对比),因为这种混编的情况比较实用于oc是单例类的情况。例如系统设备的 "UIDevice" 等比较合适.

state_2:头文件也需要被包含的情况,其实这就是一个转化,只需要在多包含一层就可以了,然后转化成state_1 来解决

1.我们建立一个 "COCFileState_2_Mid.mm" 的中间类,用来封装oc的代码, 代码很简单如下:

"COCFileState_2_Mid.h"

#include "CSingleton.h"
#import "COCFile.h"
class CState_2_Mid :public Singleton{
private:
  COCFile * m_ocFile;
  ~CState_2_Mid();
public:
  CState_2_Mid();
  COCFile getFile();
};

"COCFileState_2_Mid.mm"

CState_2_Mid::~CState_2_Mid(){
  [m_ocFile release];
  m_ocFile = NULL;
}

CState_2_Mid::CState_2_Mid(){ 
   m_ocFile = [[COCFile alloc]init];
}

COCFile * CState_2_Mid::getFile(){
    return m_ocFile;
}

2.下面的方法估计你看了会感觉很熟悉,是的 下面就是重复state_1那就直接上代码嘛

"CState_2.h"

#include < iostream >
#include "CSingleton.h"

class CState_2:public Singleton{

public:
  const char * getName();
  int getCount();
};

"CState_2.mm"

#include "COCFileState_2.h"
#import "COCFileState_2_Mid.h"

const char * CState_2::getName(){
  COCFile * file = CState_2_Mid::getInstance()->getFile();
  return [file.name_ UTF8String];
}

int CState_2::getCount(){
  COCFile * file = CState_2_Mid::getInstance()->getFile();
  return [file.count_ intValue];
}

3.这样就可以在HelloWorldScene中调用这2个方法来获取原来在oc中的数据了。代码如下:

const char * name_1 = CState_2::getInstance()->getName();
int count_1 = CState_2::getInstance()->getCount();
CCLOG("name_1 = %s",name_1);
CCLOG("count_1 = %d",count_1);

输出如下:
Cocos2d: name_1 = text
Cocos2d: count_1 = 3</pre>

OC转c++就是这两种情况。C++转oc也是类似的情况。

思考:

  1. 其实我们可以仔细看一眼state_2的步骤2,3和state_1的步骤2,3有什么区别?
  2. 有没有发现其实抛去方法来看,他们都只是一个遵守一个规则的?

原则:c++写在 .cpp中, oc 写在.m 中,oc与c++混编那么就需要.mm。

那么我在c++中调用c++的代码总没问题把,这样只需要.cpp就可以了. oc的同理
所以,你只需要想尽一切办法 将oc的方法 转化成一个个c/c++接口来给c++调用就可以了。
好吧就写道这里了。估计现在你应该很清楚怎样去混编c++与oc 了

另:可能上面步骤比较罗嗦,但我还是比较喜欢这种小步进步,步步为营的方式,这样不会出现非常严重的问题,也不会突然束手无策。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容