9

私はC++を初めて使用します。オブジェクトポインタとメンバー関数へのポインタについて知りたい。私は次のようなコードを書きました:

コード:

#include <iostream>
using namespace std;
class golu
{
   int i;
public:
   void man()
   {
      cout<<"\ntry to learn \n";
   }
};
int main()
{
   golu m, *n;
   void golu:: *t =&golu::man(); //making pointer to member function

   n=&m;//confused is it object pointer
   n->*t();
}

しかし、コンパイルすると、次の2つのエラーが表示されます。

pcc.cpp: In function ‘int main()’:
pcc.cpp:15: error: cannot declare pointer to ‘void’ member
pcc.cpp:15: error: cannot call member function ‘void golu::man()’ without object
pcc.cpp:18: error: ‘t’ cannot be used as a function.

私の質問は次のとおりです:

  1. このコードで何が間違っているのですか?
  2. オブジェクトポインタの作り方は?
  3. クラスのメンバー関数へのポインタを作成する方法とそれらを使用する方法は?

これらの概念を説明してください。

4

4 に答える 4

8

ここで修正された2つのエラー:

int main()
{
   golu m, *n;
   void (golu::*t)() =&golu::man; 

   n=&m;
   (n->*t)();
}
  1. ポインタを機能させたい
  2. 演算子の優先順位はあなたが期待したものではありません、私は括弧を追加しなければなりませんでした。n->*t();あなたが望む間として解釈され(n->*(t()))ます(n->*t)();
于 2011-06-07T08:49:27.460 に答える
5

メンバー関数ポインターの形式は次のとおりです。

R (C::*Name)(Args...)

ここRで、は戻り型、Cはクラス型でありArgs...、関数への可能なパラメーターです(またはなし)。

その知識があれば、ポインタは次のようになります。

void (golu::*t)() = &golu::man;

()メンバー関数の後に欠落していることに注意してください。それはあなたがちょうど得たメンバー関数ポインタを呼び出そうとします、そしてそれはオブジェクトなしでは不可能です。
さて、それは単純なtypedefではるかに読みやすくなります:

typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;

最後に、メンバー関数を使用するためにオブジェクトへのポインターは必要ありませんが、括弧が必要です。

golu m;
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
(m.*t)();

()演算子(関数呼び出し)は(および)演算子よりも優先度(優先度とも呼ばれます)が高いため、括弧は重要です。.*->*

于 2011-06-07T08:50:22.597 に答える
2

'void golu :: * t =&golu :: man();' 'void(golu :: * t)()=&golu::man;'に変更する必要があります 静的関数の結果へのポインターではなく、関数へのポインターを使用しようとしています!

于 2011-06-07T08:46:32.000 に答える
1

(1)関数ポインタが正しく宣言されていません。

(2)次のように宣言する必要があります。

void (golu::*t) () = &golu::man;

(3)メンバー関数ポインタは、のオブジェクトで使用する必要がありますclass

于 2011-06-07T08:48:41.290 に答える