从Objective-C调用C++

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)

这段代码并不完美!我无法识别命名空间测试.我会尽快更新.

但这应该让你到那儿!!!!