2012-04-19 18 views
2

は、私のコードの一部です:ああでクラス内のメソッドのアドレスを取得する方法は?ここ

:a.cppで

class classA 
{ 
public: 
void (*function_a)(void); 
classA(); 
void function_a(); 
}; 

void classA::classA() 
{ 
    (*function_a)() = function_a; 
} 

void classA::function_a() 
{ 
    return; 
} 

私はfunction_aのアドレスを取得し、無効(* function_a)にそれを保存したいです(無効)が、私は "表現が割り当てられない"というコンパイルエラーを得ました。この問題を解決するにはどうすればよいですか?

+0

あなたは本当に達成しようとしていますか?あなたが何をしたいのかを説明するなら(現在どのように実装しようとしているかではなく)、もっと良いテクニックを提案するかもしれません。 –

+0

related:http://stackoverflow.com/questions/1485983/calling-c-class-methods-via-a-function-pointer –

答えて

7

まず、さまざまなものに異なる名前を選択します。

第二には、非静的メンバ関数ポインタのように宣言する必要があります。その後、割り当てのようにする必要があります

void (classA::*memfun)(void); //note the syntax 

memfun = &classA::function_a; //note &, and note the syntax on both sides. 

、あなたがこれを呼び出す:

classA instance; 
(instance.*memfun)(); 

これはC++ 03での作業です。

ただし、C++ 11ではstd::functionも使用できます。

std::function<void(classA*)> memfun(&classA::function_a); 

、あなたはこれを呼び出します:ここではあなたがそれを行う方法ですナワズはすでにそれを正しく行う方法を説明してい

classA instance; 
memfun(&instance); 

Online demo

+0

注意:gcc 4.9.2 on https://www.codechef.com/ide준 http://ideone.com/kQuZQのコードで、3/17/2017にコンパイルエラーが発生しました。 cpp.shはそれをコンパイルしました。道徳:何かを終える前に違うことをしよう。 – qqqqq

3

クラス関数へのポインタを格納するには、特別なものが必要です。メンバへのポインタです。 Here you can find a good explanation

要するに、メンバ関数は、このポインタを現在のクラスに渡す必要があるため、通常の関数ポインタに格納することはできません。静的メンバー関数は、このポインタを必要としないので、通常の関数のように機能します。

-1

。グローバル関数へのポインタと比較して、クラスメンバ関数へのポインタには多くの制限があります。唯一の例外は静的メンバ関数であり、クラスの名前空間のメンバである点を除けば、ほぼ同じグローバル関数です。

関数ポインタの代わりのC++は関数オブジェクトです。その後、あなたは次の操作を行うことができます

class MyFunction 
{ 
public: 
    <return-type> operator() (... parameters ...); 
}; 

:これらは、オペレータの一つまたは複数のオーバーロード()を持つクラスです

MyFunction fnct; 
fnct(... args ...); 

つまり、あなたが関数のようにクラスのインスタンスを使用することができます。

1

多分あなたは、あなたがこれらのライブラリのいくつかについて学ぶたらやろうとしているものは何でもよりよく再設計することができます

1)あなたは、C++ 11を使用している場合、あなたはstd::function

2を使用することができますが)それ以外の場合あなたは古いコンパイラに悩まされているので、使用することができますboost::function

これらのいずれかが、後で呼び出すための関数を渡す機能を提供します。

関連する問題