5

C++ クラスの目的の c でラッパー クラスを記述する必要があります。

次の「Cocoa プロジェクトで C++ クラスを使用しているときに標準 C++ インクルードが見つからない」を参照し、レキシカルまたはプリプロセッサの問題を取り除くことができました: 「ベクター」ファイルが見つからない問題。

ただし、いくつかのパラメーターを受け入れる 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

/////////////////////////////////////////////// //////////////////////////////

//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#>)
}
4

1 に答える 1

5

「コンパイル単位」を読んでください。つまり、ヘッダー ファイルがコンパイラに対してどの言語で記述されているかを知る方法はありません。したがって、ヘッダーを含むソース ファイルの言語が常に使用されます。そのため、ファイルから C++ ヘッダーをインクルードし.mても機能しません。C++ ヘッダーを使用するすべてのObjC ファイルについて、それを使用.mするソース ファイルのファイル名サフィックスを からに変更する必要があります.mm。ラバーバンド ライブラリのソース ファイルは必要ありません。ObjC だけでなく、ObjC++ を使用するすべてのファイルを作成するだけで済みます。

もちろん、すべてのファイルを ObjC++ に変更したくない場合もあります。C++ をラップする代替アプローチのコードはかなり近いものです。私が気づいたことの 1 つは<#foo#>、コードにまだプレースホルダーがあることです (Xcode ではプレースホルダーが青い丸みを帯びたカルタッチとして表示されることがあります。これが、おそらく以前に気付かなかった理由です)。通常の C 関数呼び出しの場合と同様に、これらをパラメーター変数の実際の名前に置き換えれば、すべてがコンパイルされます。すなわち:

-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
    static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process( input, samples, final );
}

processまた、呼び出しの後にセミコロンを省略したように見えることにも注意してください。

ところで、どこでも使用する必要をなくすこともできstatic_castます。ここにリストされているトリックを参照してください:コンパイルおよびリンク時に C++ のメイン関数とクラスを Objective-C および/または C ルーチンから分離できますか? さらに役立つ情報がここにもあるかもしれません: How to call C++ method from Objective-C Cocoa Interface using Objective-C++

于 2015-02-12T10:46:26.510 に答える