当前位置: 首页 > 知识库问答 >
问题:

如何从Objective-C向C++函数发送数组

毋澄邈
2023-03-14

我试图从Objective-C向C++中的函数发送一个NSMutableArray,甚至两个字符串,但没有成功。 从C++将一个字符串返回到Objective-C,我没有任何问题,但我感到困惑的是另一种方式。 下面是我从C++获取字符串的代码:

WrapperClass.h

#ifndef WrapperClass_hpp
#define WrapperClass_hpp

#include <stdio.h>
#include <stdlib.h>

@interface WrapperClass : NSObject
@end

@interface WrapperClass ()
- (NSString *)getHelloString;
- (NSMutableArray *)sendInfo :(NSString *)str1 :(NSString *)str2; 

// the array above is what I want to send to C++

@end

#endif /* WrapperClass_h */

WrapperClass.mm

#import <Foundation/Foundation.h>

#import "WrapperClass.h"
#include "WrapperClass.h"
#include "CppClass.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;
}

- (NSMutableArray *)sendInfo :(NSString *)str1 :(NSString *)str2 {
    std::string str1 = std::string([str1 UTF8String]);
    std::string str1 = std::string([str2 UTF8String]);
    std::array<std::string, 2> myArray = {{ str1, str2 }};

// Not sure how to send to CPP ...

}

cppclass.h

#ifndef Cpp_Class_h
#define Cpp_Class_h

#include <stdio.h>
#include <string>
#include <array>

using namespace std;

namespace test {
    class HelloTest {
    public:
        std::string getHelloString();
    };
}
#endif 

cppClass.cpp

std::string test::HelloTest::getHelloString() {
    std::string outString = "Hello World!";
    return outString;
}

// this code gets the string from c++, but how to 
// send two strings or an array to a function?

共有1个答案

楚举
2023-03-14

根据我的意见,保持指向C++类的指针:

@interface WrapperClass ()
@property (nonatomic) HelloTest* helloTest;
@end

最好还是考虑使用std::unique_ptr 来管理内存。

在C++类中添加set方法(省略实现):

namespace test {
    class HelloTest {
    public:
        std::string getHelloString() const;    // Add const!
        void setHelloStrings(const std::array<std::string>& strings);
    };
}

然后像这样从Objective-C++中传递它:

- (NSMutableArray *)sendInfo :(NSString *)str1 :(NSString *)str2 {
    std::string str1 = std::string([str1 UTF8String]);
    std::string str1 = std::string([str2 UTF8String]);
    std::array<std::string, 2> myArray = {{ str1, str2 }};
    self.helloTest->setHelloStrings(myArray);
}
 类似资料:
  • 主要内容:1. 定义方法,2. 方法声明,3. 调用方法,4. 函数参数函数是一组一起执行任务的语句。 每个Objective-C程序都有一个C函数,也就是函数,所有最简单的程序都可以定义为函数。 可将代码划分为单独的函数。如何在不同的函数之间划分代码取决于程序员,但逻辑上这个划分通常是这样,每个函数执行一个特定的任务。 函数声明告诉编译器函数的名称,返回类型和参数。 函数定义提供函数的实际主体。 在Objective-C中,基本上会将函数称为方法。 Objectiv

  • 问题内容: 我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我已经创建了文件“ ”和“ ” 对我来说,从Swift调用函数到Objective-C很容易,但是我有一个反向问题。 因此,我创建了一个简单的类“ System.Swift” 现在我尝试按照此处和文件内的文档进行操作 并且已将其导入到Objective-C类中。此时,在我的Objective-C代码的Object

  • 主要内容:1. 声明数组,2. 初始化数组,3. 访问数组元素,4. Objective-C数组详细介绍Objective-C编程语言提供了一种叫作数组的数据结构,它可以存储相同类型的固定大小顺序元素的集合。数组用于存储数据集合,但将数组视为相同类型的变量集合通常更有用。 可以声明一个数组变量(例如)并使用,和,来表示单个变量,例如:,,和,而不是声明单个变量。 使用索引来访问数组中的特定元素。 所有数组都包含连续的内存位置。 最低地址对应于第一个元素,最高地址对应于最后一个元素。 1. 声明数

  • 下面是我的代码: 是不可能插入IMEI的事实,这就是为什么它不张贴,还是其他一些问题? 谢谢你的协助。

  • 正如我们在上一章中看到的,Objective-C编程语言如何允许从函数返回数组,类似的方式Objective-C允许您从函数返回指针。 为此,您必须声明一个返回指针的函数,如下例所示 - int * myFunction() { . . . } 要记住的第二点是,将局部变量的地址返回到函数外部并不是一个好主意,因此您必须将局部变量定义为static变量。 现在,考虑以下函数,它将生成10个随机数

  • 在Objective-C编程语言中,要以对象形式保存基本数据类型,如:,,。Objective-C提供了一系列与一起使用的方法,一些常用重要的方法列在下表中。 编号 方法 描述 1 创建并返回包含给定值的对象,将其视为。 2 创建并返回包含给定值的对象,将其视为。 3 创建并返回包含给定值的对象,将其视为。 4 创建并返回包含给定值的对象,将其视为。 5 创建并返回包含给定值的对象,将其视为。 6

  • 问题内容: 我想从JavaScript 调用,这是一个C#函数。我尝试了下面的代码,但是无论JavaScript条件是还是,都被调用了! JavaScript代码: 后面的C#代码: 如何从JavaScript调用C#函数? 问题答案: 您可以使用Web方法和Ajax:

  • 问题内容: 我需要从Java调用C#函数,为此,我创建了以下代码。我有一个创建的Java头文件Authenticator.h,代码如下: 然后,我创建了一个身份验证的C#函数 然后,我尝试使用以下代码从C ++(项目创建dll)中调用C#函数; 最后创建一个需要从Java调用的dll。该dll已创建,并且可以在Java中很好地加载它,但是在Java中却收到此错误日志。我可能会错过什么。 问题答案: