1

このエラーを解決できません: コード:

class myClass
{
  public:
     void callMain() ;
     void (*callme)(int a , int b);

}
void myClass::callMain()
{  
        callSomeApi(callme, <some arguments>);  //callme function pointer is passed as argument
}

void (myClass :: *callme) (int a, int b)            //  it this the correct way to define a function pointer
{

}

Visual Studio 2008 エラー C2470 で次のエラーが発生します: callme は関数定義のように見えますが、パラメーター リストはありません。見かけの体をスキップする`

編集: 私の考え: 1. クラス myClass でメンバー関数ポインターを作成したい 2. スコープ外で定義します。3. その関数ポインタをいくつかの Api 関数のパラメータとして渡します。

4

3 に答える 3

0

あなたはこのようなことをしようとしていると思いますが、私は間違っているかもしれません

class MyClass
{
   public:
   typedef void (*funcPtr)(int, int);
   MyClass(funcPtr whatToCall)
   { 
     callme = whatToCall;
   }
   void myClass::callMain()
   {  
       callSomeApi(callme, <some arguments>);  //callme function pointer is passed as argument
   }
private:
   funcPtr callme;
};

void f(int a, int b) {blah blah blah};


int main()
{
   MyClass myObject(f);
   myObject.callMain(); //will call the api function with f passed as argument
}
于 2010-11-25T14:46:32.767 に答える
0

ここで何をしようとしているのかを判断するのは困難です。メソッドとして定義callmeし、そのポインターを?の最初のパラメーターとして渡しますcallSomeApi()か?その場合は、それを単純な古いメソッドとして定義し、次のように入力callSomeApi(&callme, ...)callMain()ます。クラスに関数ポインタメンバーは必要ありません。

何らかの理由でメンバーとして関数ポインターが必要な場合は、5行目の宣言が正しいので、別の場所で定義する必要がある、をcallme = &someFunction指すようにポインターを設定するように入力できます。someFunction()

于 2010-11-25T14:51:04.953 に答える
-1

ですが、なぜ体があるのですか?callmeメンバー(関数ポインタ)です。

編集私はこれがなぜ反対票を投じられているのか分かりません。

書くことはしません

int (*a)(int, int) {
}

タイプが。int (*a)(int, int);の変数を定義するためです。aint (*)(int, int)

オープナーがで関数をコールバックとして使用したい場合callSomeApi、彼はする必要があります

class myClass {
    ....
    void callme(int a, int b);
    ....
}

void myClass::callMain() { callSomeApi(&myClass::callme, this, <etc>); }

void myClass::callme(int a, int b) { ... }

そして、callSomeApiがpmfsまたは関数オブジェクトを受け入れることを期待します(そして使用bindまたは同様の技術)

オープナーの変更を編集します。

メンバー関数へのポインターはポインターです。関数ではありません。

説明する、

int a() { return 1; }

関数を定義しますa。この関数のタイプはint ()です。関数には関数本体もあります。

ただし、関数ポインタは次の方法で定義されます。

int (*f)();

この場合fは関数ポインタです。関数本体はありません(関数ではないため)。

=:を介して関数ポインタに割り当てることができます。f = &a;またはf = a;、たとえば、f();後で呼び出すことができますa

しかし、基本的に、関数ポインタには本体がありません。メンバー関数へのポインタもありません。

于 2010-11-25T14:37:40.987 に答える