在C++中使用Objective-C类
Using an Objective-C Class in C++
我是Objective-C的新手,我正在为我们的项目构建一个iCloud实用程序库。我在Objective-C中创建了一个iCloud实用程序类。我注意到在Objective-C中使用C++类有很多问题,但很少有其他问题。问题是,我们的项目(以及在其上构建项目的引擎)完全是用C++编写的,因此,我编写的objective-C icloud类需要可以从我正在编写的C++接口访问。
这里有一个例子:
iCloudUtils.h
#import <Foundation/Foundation.h>
@interface iCloudUtil : NSObject
@property(nonatomic, assign, getter=isAvailable) BOOL iCloudIsAvailable;
@property (assign) NSString *urlToFile;
-(bool) init_iCloud;
-(void) loadDocument: (NSString*)fileUrl;
@end
iCloudUtils.m
#import "iCloudUtil.h"
@synthesize urlToFile = _urlToFile;
@synthesize iCloudIsAvailable = _iCloudIsAvailable;
//////////////////////////////////////////////////////
@implementation iCloudUtil
-(bool) init_iCloud{
//blah blah
}
-(void) loadDocument: (NSString*)fileUrl{
//more blah blah
}
@end
我尝试使用的C++类是这样的:
iCloudInterface.h
#ifndef __ICloudInterface__
#define __ICloudInterface__
class ICloudInterface {
static ICloudInterface *_instance;
bool iCloudIsAvailable;
public:
ICloudInterface();
~ICloudInterface();
bool init_iCloud();
};
#endif
我想做的是能够在我的C++类中创建iCloudUtils的实例,但如果不在程序中出现200多个关于"Stray'@'"的错误,我就无法将其#包含在我的C++类中。我对Objective-C非常缺乏经验,更不用说将其与C++混合了,所以有人能帮我提供如何实现这一目标的建议吗?
编辑:为了清除它,我已经尝试将.cpp重命名为.mm,但这并没有解决问题。
第2版:此外,根据我的理解(如果我错了,请纠正我),通过将文件更改为.mm,任何包含它的文件也必须更改为.mm.我不能这样做,因为这需要更改非常非常大量的文件来适应单个可选类(提醒您,这个项目及其引擎都是c++,这是一个跨平台的引擎和项目)。
不能在文件扩展名为.cpp 的C++文件中使用Obj.C类对象
您可以在扩展名为.mm 的Object.c类中使用c++类
为了在C++和amp;对象C类,在.mm文件中编写辅助对象C++类
说:
interface iCloudUtil : NSObject // in .m file
class ICloudInterface //in cpp file.
您可以使用桥接类帮助在.cpp文件中的cpp类和.m文件中的obj.C类之间进行通信。
//include iCloudUtil.h only in ICloudBridge.mm file.
class ICloudBridge {
static ICloudBridge *_instance;
public:
ICloudBridge();
~ ICloudBridge();
ICloudBridge *sharedICloudBridge();
void loadDocument();
};
void ICloudBridge:: loadDocument()
{
iCloudUtil *obj = [iCloudUtil alloc] init] autorelese];
[obj loadDocument:@"DocName"];
}
在ICloudInterface.cpp 中
ICloudBridge *bridge = ICloudBridge::sharedICloudBridge();
bridge-> loadDocument();
将.cpp文件名切换为.mm-这将使其从c++转换为objective-c++。然后,您将编译一种能够理解标头的语言。
我认为您必须在源代码文件名中使用.mm
扩展名而不是.m
扩展名,或者在Xcode中将文件设置为编译为Objective-C++。
当然——你可以做到。主要需要的是设置。CPP文件作为"Objective-C++源"——".mm"约定是一个自动的细节,但不是必需的。然后你可以随心所欲地混搭:
#import <Foundation/Foundation.h>
#include <iostream>
@interface iCloudUtil : NSObject
@property(nonatomic, assign, getter=isAvailable) BOOL iCloudIsAvailable;
@property(assign) NSString *urlToFile;
- (bool) init_iCloud;
- (void) loadDocument:(NSString*)fileUrl;
@end
//////////////////////////////////////////////////////
@implementation iCloudUtil
@synthesize urlToFile = _urlToFile;
@synthesize iCloudIsAvailable = _iCloudIsAvailable;
- (bool) init_iCloud {
NSLog(@"init_iCloud");
std::cout << "i can mix std c++ in here as welln";
return YES;
}
- (void) loadDocument:(NSString*)fileUrl {
NSLog(@"url is %@",fileUrl);
}
@end
//////////////////////////////////////////////////////
class ICloudInterface {
static ICloudInterface* _instance;
bool iCloudIsAvailable;
iCloudUtil* myCloudUtil;
public:
ICloudInterface();
~ICloudInterface();
bool init_iCloud();
};
ICloudInterface::ICloudInterface() {
std::cout << "ICloudInterface::ctorn";
myCloudUtil = [[iCloudUtil alloc] init];
[myCloudUtil init_iCloud];
[myCloudUtil loadDocument:@"file://foo/bar/baz"];
}
ICloudInterface::~ICloudInterface() {
[myCloudUtil release], myCloudUtil = nil;
std::cout << "ICloudInterface::dtorn";
}
int main(int argc, const char * argv[]) {
std::cout << "Test objc/objc++n";
ICloudInterface iface;
return 0;
}
- 如何将数组从Objective-C发送到C++函数
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字
- Mac Snow Leopard 上的 Qt 5.3.2:ld:在架构x86_64 [clang、Objective-C
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- C++对象作为 Objective-C++ 属性
- 将.cpp文件中的数据传递给Objective c ViewController
- 为什么这个来自 Objective-C++ 的dynamic_cast在调试中成功但在发布时失败?
- Objective-C 如何使用向量对?
- 在 Objective-C 和 Swift 之间委托问题
- Objective-C C++ 包装器 类型错误的不完整定义
- EXC_BAD_ACCESS Xcode,来自我的 Objective-C++ 和 swift 桥接标头中的 C++ 包
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 如何发送(和接收)从 Swift 到 Objective c++ 再到 c++,然后备份到 Swift 的超大型浮动数组
- 使用来自Objective C的OpenCV分解同源异构图
- 如何将这行代码从C++转换为Objective-C
- Firebase:混合使用C++和Objective-C SDK可以吗
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 有没有办法将函数从 objective-c++ 传递到标准 c++
- 从Objective-C中的C 标头读取变量
- Objective-C 块中的泄漏C++ shared_ptr