0

コード

class cat{

        public:
           void walk(){
                printf("cat is walking \n");
           }

           void myAbc(){
               void (*pKoo)();
               pKoo = &this->walk;
           }

          void myDef(){
               void(cat::*pFoo)();
               pFoo = &this->walk;
          }
        }

    };

結果

  1. ボイド (*pKoo)(); - 問題ない
  2. pKoo = &this->walk; - コンパイルエラー
  3. void(猫::*pFoo)(); - 問題ない
  4. pFoo = &this->walk; - コンパイル エラー。

質問

  • なぜ不可能なのですか?不可能ならNo.1の用途は?
  • なぜ4は不可能なのですか?不可能なら、No 3 の用途は何ですか?

概念的な説明のために助けてください。ありがとうございました

4

2 に答える 2

2
void (*pKoo)();                
pKoo = &this->walk; 

関数ポインターの型が、アドレスを割り当てる関数の型と一致しないため、エラーが発生します。

のタイプwalk()は次のとおりです。

void (cat::*)(void);

void(cat::*pFoo)();
pKoo = &this->walk; 

次のようにする必要があります。

pKoo = &cat::walk;

メソッドは、クラスの特定のインスタンスではなくwalk、クラスに属します。catしたがって、使用できませんthis->walk()が、メソッド名をクラス名で修飾する必要があります。

于 2012-08-29T09:54:11.090 に答える
2

なぜ不可能なのですか?

私のコンパイラはエラーメッセージを出します:

cannot convert ‘void (cat::*)()’ to ‘void (*)()’ in assignment

つまり、メンバー関数へのポインターを関数へのポインターに変換することはできません。それらは互換性のない型です。関数へのポインターは直接呼び出すことができますが、メンバー関数へのポインターはオブジェクトに適用する必要があります。void (cat::*)();したがって、割り当てる型は、3 で正しく使用するように、メンバー関数へのポインター、またはである必要があります。

不可能ならNo.1の用途は?

静的関数または非メンバー関数へのポインターを格納するために使用されます。

なぜ 3 は不可能なのですか?

(3 ではなく 4 を意味していると思います。) 私のコンパイラは次のエラー メッセージを表示します。

ISO C++ forbids taking the address of a bound member function to form a 
pointer to member function.  Say ‘&cat::walk’

何らかの理由で、オブジェクト (またはポインター) を使用してメンバー関数のアドレスを取得することは許可されていません。代わりにクラス名を使用する必要があります。これが許可されていない理由については推測することしかできません。おそらく、それが仮想である場合にどのオーバーライドを選択する必要があるかが完全に明確ではないため、またはおそらく他の理由のためです。

理由が何であれ、許可されている構文を使用してください。pFoo = &cat::walk;

于 2012-08-29T10:24:53.177 に答える