2017-11-03 27 views
2

これはこのウェブサイトの最初の投稿です。私はC++でハッシュテーブルをコーディングするプロジェクトに参加しています。私は関数ポインタに問題があります。C++ - 関数ポインタ付きハッシュテーブル

私はハッシュテーブルを持っています。このハッシュテーブルには、いくつかの学生(学生の番号で識別される)が含まれています。私はパラメータでハッシュを渡すために関数ポインタを使う必要があります。

私のコードは下にある:

//file main.cpp 
Table t1; 
unsigned int(Table::* ptrHash)(unsigned int); 
ptrHash = &Table::hash; 
t1.insertStudent(11507461, 20, ptrHash); 

// file Table.cpp 
void Table::insertStudent(unsigned int numberStudent, unsigned int (*f)(unsigned int)) {...} 
unsigned int Table::hash(unsigned int cleEtu) {...} 

//file Table.h 
void insertStudent(unsigned int numberStudent, unsigned int (*f)(unsigned int)); 
unsigned int hash(unsigned int numberStudent); 

私のプロンプトが私にこのエラーを与える:

no matching function for call to 'Table::insertStudent(int, unsigned int (Table::*&)(unsigned int))' t1.insererEtu(11507461, 20, ptrHachage); 
note:no known conversion for argument 3 from ‘unsigned int (Table::*)(unsigned int)’ to ‘unsigned int (*)(unsigned int)’ 

私はそれはそれのために同じではないのですが、私はそれを解決する方法を知らないことを理解しています。私はたくさんの方法を試していますが、誰も仕事をしていません。

誰かが私を助けることができるなら、それは私を助けるでしょう!

+0

メンバ関数のポインタ型は、通常のポインタ型とは異なります。これは '(*)'だけでなく、 'Table :: *'を見る理由です。いずれかメンバー関数を非メンバー関数ポインタにする方法を見つけるか、ハッシュテーブルにメンバー関数ポインタを使用するほうがよいでしょう。 – AndyG

+0

ハッシュ関数をメンバー関数ではなく自由関数として定義します。 (関数ポインタを渡すポイントは、関数がハッシュテーブルから独立しているということです)。しかし、挿入のたびに異なるハッシング関数を使うと、コンストラクタに関数ポインタを渡す方が合理的です。 – molbdnilo

+0

[mcve]も提供してください。さもなければ、この質問は閉鎖される可能性が高いです。 – AndyG

答えて

2

通常の関数へのポインターとメンバー関数へのポインターには違いがあるためです。関数insertStudentは通常の関数へのポインタをとりますが、Tableクラスのメンバ関数へのポインタで呼び出すことができます。

個人的に私は全くこの場合には関数ポインタを使用することはありません、私は、ハッシュ関数の insertStudentがパラメータになるだろう。これにより、ハッシュ関数は、intを受け入れ、intを返す関数呼び出し演算子を持つオブジェクトになります。

私の先生が関数ポインタを使用するように強制していた場合、ハッシュ関数をTableクラスの静的メンバー関数にして、閉じたままにしておきます。静的メンバー関数と非静的メンバー関数には基本的な違いがあります。静的メンバ関数は、特定のオブジェクトに対して呼び出されないため、通常の関数に密接に関連しています。

+2

それではどうしたらうまくいくのですか?私はこの答えがlambdasとstd :: bindへの提案で洗練されていると思う。 – UKMonkey

+0

実際、ハッシュ関数は決して 'insertStudent()'の引数であってはなりません。これは、テーブルのコンストラクタの引数にする必要があります。関数の引数、テンプレートの引数、または仮想継承のどちらが本当に問題ではありません。しかし、それは要素ごとに変更可能でなければならないものではありません。 – cmaster

+0

私はクラスメートと議論しており、メインでハッシュ関数を使用しています(Tableのメンバ関数とは異なります)。私はこのようにします。あなたの答えをありがとう! –