Ank*_*ara 5 objective-c objective-c++ rubber-band ios
我需要在C++类的Objective c中编写一个包装类.
我已经提到了以下无法找到标准C++包括在Cocoa项目中使用C++类时能够摆脱词法或预处理器问题:'vector'文件未找到问题.
但是,我不明白将C++方法转换为接受客观c方法的几个参数.
有人可以帮我这样做吗?我想要做的是为此http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85编写一个包装类
我试过这样做,以下是我坚持的方法......
// Wrapper.h
#import <Foundation/Foundation.h>
@interface Wrapper : NSObject {
void *myRubberBandStretcher;
}
#pragma mark - Member Functions
-(void)process:(const float)input samples:(size_t)samples final:(bool)final;
@end
Run Code Online (Sandbox Code Playgroud)
////////////////////////////////////////////////// ///////////////////////////////
//Wrapper.mm
#import "Wrapper.h"
#import "RubberBandStretcher.h"
@implementation Wrapper
-(id)init {
self = [super init];
if (self) {
myRubberBandStretcher = new RubberBand::RubberBandStretcher::RubberBandStretcher(44100, 2, 0, 1.0, 1.0);
}
return self;
}
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process(<#const float *const *input#>, <#size_t samples#>, <#bool final#>)
}
Run Code Online (Sandbox Code Playgroud)
您应该阅读“编译单元”。简而言之,没有办法告诉编译器用什么语言编写头文件。因此,它始终使用包含标题的源文件的语言。因此,如果您从.m文件中包含 C++ 头文件,它将不起作用。对于每一个使用C ++头ObjC文件,你必须改变的源文件的文件名后缀的用途从中.m来.mm。您不需要橡皮筋库的源文件,您只需要制作所有使用它的文件 ObjC++ 而不仅仅是 ObjC。
当然,您可能不想将所有文件都更改为 ObjC++。您用于包装 C++ 的替代方法的代码非常接近。我注意到的一件事是<#foo#>您的代码中仍然有占位符(Xcode 可能会将它们显示为蓝色圆形圆形装饰,这可能是您之前没有注意到它们的原因)。将它们替换为参数变量的实际名称,就像使用常规 C 函数调用一样,并且所有内容都应该编译。IE:
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process( input, samples, final );
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您似乎在process调用后省略了分号。
顺便说一句,您也可以不必static_cast到处使用,请参阅此处列出的技巧:我可以在编译和链接时将 C++ 主函数和类与 Objective-C 和/或 C 例程分开吗?这里可能还有一些更有用的信息:How to call C++ method from Objective-C Cocoa Interface using Objective-C++
| 归档时间: |
|
| 查看次数: |
2633 次 |
| 最近记录: |