Pat*_*cia 14 c++ objective-c objective-c++ ios
对于那些已经成功地从Objective-C调用C++代码的人,请您启发我吗?
这个链接说你需要使用他在文章中描述的技术来包装你的C++代码.它看起来不错,但我仍然有问题.
这个链接说,只要调用C++类的Objective-C类已经转换为.mm(Objective-C++)类,那么这两个应该可以很好地协同工作.
在我尝试添加方法调用时,这些方法中的每一种都让我感到悲伤.有人可以给我一个简单的Hello World iOS应用程序的代码,该应用程序使用Objective-C作为"Hello"部分,而使用Objective-C++类的"World"部分使用C++类吗?或者我仍然有错误的整个概念?
Pat*_*cia 18
基本上你需要一个扩展名为.mm的ObjC类,它调用一个扩展名为.mm的ObjC类.第二个将用作C++包装类.包装器类将调用您的实际.cpp类.这有点棘手,所以我会给你一些冗长的代码.以下是该项目的概述:

在你的ObjC代码(ViewController)中,你将调用CplusplusMMClass
- (IBAction)buttonPushed:(UIButton *)sender {
self.mmclass = [[CplusplusMMClass alloc]init]; // bad practice; but showing code
NSString *str = [self.mmclass fetchStringFromCplusplus];
[self populateLabel:str];
}
Run Code Online (Sandbox Code Playgroud)
这是CplusplusMMClass .h和.mm
#import <Foundation/Foundation.h>
#import "WrapperClass.h"
@interface CplusplusMMClass : NSObject
@end
@interface CplusplusMMClass()
@property (nonatomic, strong) WrapperClass *wrapper;
- (NSString*)fetchStringFromCplusplus;
@end
Run Code Online (Sandbox Code Playgroud)
#import "CplusplusMMClass.h"
#import "WrapperClass.h"
@implementation CplusplusMMClass
- (NSString*)fetchStringFromCplusplus {
self.wrapper = [[WrapperClass alloc] init];
NSString * result = [self.wrapper getHelloString];
return result;
}
@end
Run Code Online (Sandbox Code Playgroud)
这是WrapperClass .h和.mm
#ifndef HEADERFILE_H
#define HEADERFILE_H
#import <Foundation/Foundation.h>
#if __cplusplus
#include "PureCplusplusClass.h"
@interface WrapperClass : NSObject
@end
@interface WrapperClass ()
- (NSString *)getHelloString;
@end
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
#import "WrapperClass.h"
#include "WrapperClass.h"
#include "PureCplusplusClass.h"
using namespace test;
@interface WrapperClass ()
@property (nonatomic) HelloTest helloTest;
@end
@implementation WrapperClass
- (NSString *)getHelloString {
self.helloTest = *(new HelloTest);
std::string str = self.helloTest.getHelloString();
NSString* result = [[NSString alloc] initWithUTF8String:str.c_str()];
return result;
}
@end
Run Code Online (Sandbox Code Playgroud)
这是PureCplusplusClass .h和.cpp
#ifndef __HelloWorld__PureCplusplusClass__
#define __HelloWorld__PureCplusplusClass__
#include <stdio.h>
#include <string>
using namespace std;
namespace test {
class HelloTest
{
public:
std::string getHelloString();
};
}
#endif /* defined(__HelloWorld__PureCplusplusClass__) */
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include <string>
std::string test::HelloTest::getHelloString() {
std::string outString = "Hello World";
return outString;
}
Run Code Online (Sandbox Code Playgroud)
这段代码并不完美!我无法识别命名空间测试.我会尽快更新.