2011-01-12 16 views
0

と仮定します。メインで何度も何度も...ポインタ

class Parser 
{ 
    public: 
    void parser1(int a, int b, int c); 
    void parser2(int d, int e, int f); 
    void setupPtr(); 

    void (Parser::*ptrParser) (int param1, int param2, int param3); 
} 

Parser::setupPtr() 
{ 
    if(bla bla) 
    { 
     ptrParser = &Parser::parser1; 
    } 
    else 
    { 
     ptrParser = &Parser::parser2; 
    } 
} 

:(ほぼ)すべての形や大きさの関数ポインタについて

int main(argv, argc) 
{ 
    Parser parser; 
    parser.setupPtr(); 
// first case 
    parser.ptrParser(some paramps); // error! error C2064: term does not evaluate to a function taking 3 arguments 
// second case 
    parser.*ptrParser(some paramps); // error! 'ptrParser' : undeclared identifier 
// third case 
    (parser.*ptrParser)(some paramps); // error!  'ptrParser' : undeclared identifier 


} 
+0

クラス内のメンバーはすべて「プライベート」なので、「メイン」からアクセスできないことに気付きましたか? –

+0

申し訳ありませんが、コードを編集してください。元の公開 – StNickolay

+0

あなたは本当に達成しようとしていますか?関数ポインタはまったく必要ないかもしれません。 –

答えて

3

あなたが公共のことptrParserフィールドを変更することを考えると、あなたはmainをこのように記述する必要があります。

int main() 
{ 
    Parser parser; 
    parser.setupPtr(); 
    (parser .* (parser.ptrParser))(1, 2, 3); 
    return 0; 
} 

ましょうラインを理解しようとする。

タイプvoid (Parser::*)(int, int, int)のポインタ・ツー・メンバ関数を呼び出すには、まず、inst呼ばParserのインスタンスポインタ・ツー・メンバ関数func与え、構文は次のとおりで

(inst .* func)(x, y, z); 

私たちの場合、インスタンスの名前はparserであり、ポインタ-to-member-functionはの構文でアクセスされるparserクラスのptrParserフィールドに格納されています。 (私は演算子の優先順位のかわからないので、かっこを追加する)、これは私たちを与える、前の式でそれを置き換える:

(parser .* (parser.ptrParser))(x, y, z); 

代わりに参照またはオブジェクトの我々はParserへのポインタを持っている場合は、構文は次のとおりです:

typedef void (Parser::*funcptr) (int , int , int); 

してからcontenerを作成します:

int main() 
{ 
    Parser *parser = createAndInitializeParser(); 
    (parser ->* (parser->ptrParser))(1, 2, 3); 
    markParserAsNotUsedDestroyIfNeeded(parser); 
    return 0; 
} 
+0

うわー!私はショックを受けているが、これは集められた!今私はそれが意味するものを理解する必要があります)。ありがとう! – StNickolay

+0

私はいくつかの説明を追加しました。私はそれが今では十分明確であることを望む。 –

+0

これは簡単なスニペットではありませんでしたが、私はこれまで見ていませんでした) – StNickolay

0

このコードには2つの問題があります。

1)ptrParserは何にも割り当てられていません。最初にParser :: setupPtrを呼び出す必要があります。

2)ptrParserは、パラメータを持たないメソッドへのメソッドポインタです。つまり、パラメータを含むように定義する必要があります。私はあなたがそれを呼び出す前にキャストしておけば、あなたはまだそれを取り除くことができると思うが、そのようなことを簡単に保つ方が良い。あなたの特定の例のためのメソッドポインタのための

宣言のようになります。

void (Parser::*ptrParser) (int, int, int); 
+0

スクラッチ#2。質問を編集してパラメータを追加する – Neil

+0

申し訳ありませんが、ビットコードが壊れています。私はそれらをフライで書いて、func-ptrの定義でparamsを忘れてしまいました。しかし、質問はまだ活発です。 – StNickolay

0

は、私はあなたがあなたの関数のPTR型のtypedefのを作るために提案することができる

class Parser 
{ 
public: 
typedef void (Parser::*funcptr) (int , int , int); 

void parser1(int a, int b, int c); 
void parser2(int d, int e, int f); 
void setupPtr(); 

funcptr firstptr; 
} 

それを設定するには:

firstptr = &Parser::parser1; 

それを呼び出すために:

Parser foo; 
foo.setupPtr; 
(foo.*(foo.firstptr))(1, 2, 3); 

それは理解することが少ないのは難しい、とあなたがfuncptr配列を作成することができるようになります...

関連する問題