2017-10-10 9 views
3

私はC++クラスを持っていますが、低レベルのCも使用しており、bsearch関数を使用する必要があります。 bsearchの最後の引数は比較関数です。クラスのconst private変数にアクセスできるように、関数を実装したいと思います。std :: bsearchでメンバー関数を使用する方法

問題は、私が比較関数をメンバー関数にすると、正規関数ポインタへの変換ができないため、機能しません。非メンバ関数を作成した場合、それをbsearchに渡すことはできますが、クラスのプライベート変数にはアクセスできません。

どうすればよいですか?

は、例えば: enter image description here

3は、比較機能が必要3 elements.16,32,56がactors.I'mオフセットarray.Iで検索を検索する必要がBSEARCH bytes.Iにオフセットされているがあることを意味しますactorを比較しますが、私はlasoが必要です。const void * actorFile比較関数内の位置を計算するポインタです.actorFIleはクラスのプライベート変数です。

+0

@StoryTeller素早く返信いただきありがとうございます。純粋なbsearchを使用することはできませんか?また私はlower_boundをすばやく見ていました。また、cmp関数も必要です。この場合、bsearchとはどのように違いますか? – sparrow2

+0

'std :: lower_bound'は任意の種類のファンクタ(関数、またはlambdaを含むoperator()が定義されたオブジェクト)をとることができます。オブジェクトを使用すると、比較を行うために必要な変数を保持できます。 – vu1p3n0x

+0

プライベートメンバーにゲッターを提供すると、compare関数はフリー関数になります。あなたがアクセスする必要がある場合は、プライベートメンバーがクラス外からアクセスすることはできません。公開するか、アクセスする方法を提供します。 – user463035818

答えて

7

解決策は、Cライブラリ関数を使用せずに、C++をそのまま使用することです。 C++標準ライブラリにはユーティリティ検索機能もあり、std::lower_boundと呼ばれています。また、通常の関数ポインタだけでなく、一般的な関数のようなオブジェクトも受け入れます。

これは、あなたのクラスをキャプチャラムダ式でそれを呼び出すことができます:あなたは本当にただ非メンバ関数の内部で、あなたのメンバ関数を使用しbsearchに関連付けられている場合

std::lower_bound(start, finish, value, [this] (auto const& lhs, auto const& rhs) { 
       /* Compare and utilize anything this can point to*/ }); 
+0

lower_boundを使う方が良いでしょうが、私は本当にbsearchに縛られています。 – sparrow2

+0

@ sparrow2 - 私は本当にどのように表示されません。 'bsearch'はプレーンな配列で*のみ*動作し、' lower_bound'はプレーンなC配列でも動作します。 – StoryTeller

+0

@ sparrow2ケーキを食べて食べることはできません。 'bsearch'はクラスとメンバ関数について何も知らないC関数です。 –

1

。したがって、プライベートメンバーにアクセスする必要はありません。

/* Create global variable to use in compare proc*/ 
actors_data_base* cmp_data_base = NULL; 

/* Write compare routine like */ 
int cmp_proc(const void * a, const void * b) 
{ 
    size_t a_offset = static_cast<size_t>(a); 
    size_t b_offset = static_cast<size_t>(b); 
    return cmp_data_base->compare_actors(a_offset, b_offset); 
} 


/* Set global pointer and use bsearch */ 
actors_data_base = &my_data_base; 
bsearch(&my_value, array, size, sizeof(size_t), cmp_proc); 

間違いなく、これはグローバル変数を使用しているためです。しかしこれはprocを比較するコンテキストを渡す唯一の方法です。スレッドのローカルストレージを使用してスレッドの問題を回避することも考えられます(cmp_procはグローバル変数のために同時に使用してはいけません)

したがって、std::lower_boundを使用するほうがずっと良いでしょう。

+0

コンパイラは、クラスファイル内の非メンバ関数内でメンバ関数を使用させません。インスタンスがなく、そのインスタンスのメンバメソッドを呼び出す場合は、 – sparrow2

+0

を明示してください。私は例を追加します。 – ivaigult

関連する問題