4

ここに私のコードの一部があります:

ああで:

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

a.cpp:

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

void classA::function_a()
{
  return;
}

function_a のアドレスを取得して void (*function_a)(void) に保存したいのですが、「expression is not assignable」というコンパイルエラーが発生しました。この問題を解決するにはどうすればよいですか?

4

4 に答える 4

9

まず、さまざまなものにさまざまな名前を付けます。

次に、非静的メンバー関数ポインターは次のように宣言する必要があります。

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); 

オンラインデモ

于 2012-04-19T15:25:53.440 に答える
3

クラス関数へのポインターを格納するには、何か特別なもの、つまりメンバーへのポインターが必要です。ここであなたは良い説明を見つけることができます

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

于 2012-04-19T15:24:06.897 に答える
1

これらのライブラリのいくつかについて学べば、やろうとしていることをより良く再構築できるかもしれません:

1) c++11 を使用している場合は、std::functionを使用できます

2) それ以外の場合、古いコンパイラで立ち往生している場合は、boost::functionを使用できます

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

于 2012-04-19T16:01:23.453 に答える
-2

Nawaz は、正しく行う方法を既に説明しています。グローバル関数へのポインターと比較して、クラス メンバー関数へのポインターには多くの制限があります。唯一の例外は、クラスの名前空間のメンバーであることを除いて、ほとんど同じ es グローバル関数である静的メンバー関数です。

関数ポインタに代わる C++ は関数オブジェクトです。これらは、1 つまたは複数の operator() のオーバーロードを持つクラスです。

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

次に、次のことができます。

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

つまり、クラス インスタンスを関数のように使用できます。

于 2012-04-19T15:42:50.697 に答える