1

これは私を打ち負かしました。(非静的) メンバー関数へのポインターである静的クラス変数が必要です。私はあらゆる種類の方法を試しましたが、運がありませんでした(typedefs を使用すると、別のエラーセットが発生するように見えました)。以下のコードには、 static クラス関数 pointerfuncptrがあり、クラスの外部からは正常に呼び出すことができますが、メンバー関数内からは呼び出すことができCallFuncptrません。これが私がやりたいことです。助言がありますか?

#include <stdio.h>

class A
{
public:
  static int (A::*funcptr)();
  int Four() { return 4;};
  int CallFuncptr() { return (this->*funcptr)(); } 
      // doesn't link -  undefined reference to `A::funcptr'
};
int (A::*funcptr)() = &A::Four;

int main()
{
  A fred;
  printf("four? %d\n", (fred.*funcptr)());  // This works
  printf("four? %d\n", fred.CallFuncptr()); // But this is the way I want to call it
}
4

3 に答える 3

3

代わりにこれを試してください:

#include <iostream>

class A {
public:
    typedef int (A::*AMemFn)();
    static AMemFn funcptr;
    int Four() { return 4; }
    int CallFuncptr() { return (this->*funcptr)(); }
};

A::AMemFn A::funcptr = &A::Four;

int main()
{
    A fred;
    std::cout << "four? " << fred.CallFuncptr() << std::endl;
}
于 2012-06-28T03:34:02.530 に答える
2

jweyrichには見栄えの良い回避策があります(そしてそれを使用することをお勧めします)が、コードの実際の問題が何であるかについて詳しく説明したいと思いました。

あなたの問題はこの行です:

int (A::*funcptr)() = &A::Four;

funcptrこれは、ではなく、正しいタイプのと呼ばれるグローバル変数を定義していますA::funcptr

必要なのはこの混乱です:

int (A::*(A::funcptr))() = &A::Four;

この醜い混乱は、typedefパスをたどって、jweyrichのソリューションのような見栄えの良いバージョンを取得することをお勧めする理由です。

于 2012-06-28T03:41:52.183 に答える
0

静的変数は、特定のオブジェクトのメンバーではありません。クラスの名前空間を介してのみアクセスできます。CallFuncptr を書き直す必要があります。 int CallFuncptr() { return (*funcptr)(); この関数は、指定せずに A の名前空間内の関数にアクセスできるため、動作するはずです。

また、関数ポインターは、C++ よりも C の構成要素です。次のコードを使用して、クラス外の静的変数にアクセスできます。 A::CallFuncptr CallFunctptr は A の名前空間にあるだけなので

于 2012-06-28T03:37:20.470 に答える