2

プログラムでコールバックを使用しましたが、このコールバックは繰り返し呼び出されるため、現在の情報を保存するメソッドを使用して、彼がどこにいるかを覚えられるようにしたいと考えています。クラスを作成し、いくつかの静的メンバーを使用してそれらを保存したいのですが、それは良くないと思います...いくつか提案が欲しいです、どうもありがとう!!

実際、私は構造体またはクラスを使用することを好みます。私のアイデアの簡単な例を示します。

callback(parameters)
{
   A* a->setcounter(record current value);
   A* a->getcounter(get current value);
   A* a->addcounter(current value ++);
   A* a->calculate(do some calculation with values);
}

私を混乱させたのは、最初にクラス A のオブジェクトを作成する必要があることですが、これを行いたくないので、静的メンバーを使用することを選択しましたが、より良い方法があるはずだと思います。

4

3 に答える 3

1

コールバック関数のパラメーターをコンテキスト オブジェクトにします。これは、コールバック関数がプログラムの状態を識別するのに役立つ状態情報をラップする構造体型またはクラスのインスタンスです。コールバック関数は、この状態を前提として、実行する操作を知ることができます。

于 2012-10-16T14:19:35.510 に答える
0

ファンクター、つまり を定義するクラスのオブジェクトを使用する場合、operator()それを関数と同じ方法で使用できます (たとえば、現在使用しているコールバック関数の代わりに) が、クラスのデータ メンバーでは次のことができます。状態情報を保存します。これに沿った何か:

class CallbackObject {
  int _state_information;
public:
  CallbackObject():_state_information(0) {}

  void operator()(int some_data_to_process) {
    /* ..process data.. */

    ++_state_information; // Update internal state
  }
};

次に、このクラスのオブジェクトをコールバック関数と同じ方法で使用できます。


ただし、C++11 を使用できる場合は、ラムダのキャプチャを使用して、同様の効果を達成する特に便利な方法があります。

#include <iostream>

/* This is our "backend" that calls the callback
   function: */
template <typename Callback>
void process(int data, Callback callback) {
  callback(data);
}

int main()
{
  /* State information: */
  int num_calls = 0;

  /* Here we define the callback function as a lambda: */
  auto callback = [&num_calls](int data) { ++num_calls; };

  /* Have it called a few times: */
  for (int i = 0 ; i < 10 ; ++i)
    process(i,callback);

  std::cout << "Callback was called " << num_calls << " times." << std::endl;
  return 0;
}

関数内のcallback変数にはmain、ラムダ関数が格納されます。[&num_calls]整数変数num_callsが参照としてキャプチャされることを意味するため、ラムダが呼び出されたときにその値に加えられた変更は、元の変数に直接影響しますnum_callsnum_callsしたがって、(もちろん、より複雑な型または複数の変数の場合もあります) のようなキャプチャされた参照を使用して、状態情報を保存および更新できます。

于 2012-10-16T14:38:34.533 に答える
0

関数内の静的変数がそれを行わない理由はありますか?

int my_callback(int i)
{
    static int my_int;
    if (i != -1) my_int = i;

    return my_int;
}

この例では、任意の値を my_callback に渡すと、その値がコールバックの静的変数に割り当てられます。ただし、-1は割り当てずに現在の値を返します。

于 2012-10-16T14:21:16.217 に答える