我正在寻找开发一组C API,它们将围绕我们现有的C++ API来访问我们的核心逻辑(用面向对象的C++编写).这基本上是一个粘合API,允许我们的C++逻辑可以被其他语言使用.什么是一些很好的教程,书籍或最佳实践,介绍了围绕面向对象的C++包装C所涉及的概念?
我正在尝试enum从 Swift访问用 C++ 标头编写的 值。具体来说,我enum在 OpenCV 的 hpp 头文件中有这个,我想将其值公开给 Swift。我试图在 Swift 和 Objective-C 之间设置一个桥接头,并在我想公开的 C++ 枚举值周围放置一个包装器,但编译器对此并不满意:
imgproc.hpp:C++ 头文件
enum ThresholdTypes {
THRESH_BINARY = 0,
THRESH_BINARY_INV = 1,
THRESH_TRUNC = 2,
...
};
Run Code Online (Sandbox Code Playgroud)
桥接头:
#import "OpenCVWrapper.h"
Run Code Online (Sandbox Code Playgroud)
OpenCVWrapper.h:我的 Objective-C Wrapper 类要暴露给 Swift
#ifdef __cplusplus
#import <opencv2/core.hpp>
#import <opencv2/imgproc.hpp>
#endif
#import <Foundation/Foundation.h>
@interface OpenCVWrapper : NSObject
typedef enum {
Binary = cv::THRESH_BINARY, // ERROR: use of undeclared identifier `cv`
BinaryInv = cv::THRESH_BINARY_INV // ERROR: use of …Run Code Online (Sandbox Code Playgroud) 作为Swift编码器,我对事物c方面的明显碎片感到困惑。不知何故,有Objective-C,Objective-C ++,c和c ++,它们都具有.h,.hpp,.m,.cpp等文件扩展名,但是我找不到关于哪个扩展名指向哪种文件类型的详尽文档。 XCode(尽管我相当确定c ++应该是.hpp和.cpp)。
这种混乱使我陷入困境,在尝试向快速代码公开C ++类时,我对自己的工作一无所知。让我解释一下我的策略。
我有一个由我修改过的XCode自动生成的桥接文件
桥接头
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#include <stdio.h>
#include <stdlib.h>
int* main1() {
int *num;
num = (int *)malloc(1000 * sizeof(int));
for (int i = 0; i < 10; i++) {
num[i] = i;
}
num[10] = 10;
free(num);
return num;
}
Run Code Online (Sandbox Code Playgroud)
如果我解释正确,那么XCode会将其视为Objective-C代码的头文件。确实,此功能可以迅速发挥作用并按预期工作。
然后,我创建了另一个文件,因为如果我尝试在该文件中导入我的c ++代码,它将尝试像objective-c一样编译它,但效果不佳。我相信该文件将是此标头的实现,并且我被告知这将是导入我的c ++代码的安全地方。
还有 Bridging-Header.m
#ifndef Bridging_Header_h
#define Bridging_Header_h
#import "Bridging-Header.h"
#import "rectangle.hpp"
int …Run Code Online (Sandbox Code Playgroud)