2
// Penguin.h
#include <map>
#include <iostream>

class Penguin
{
    typedef void (Penguin::*PenguinMet)();
    std::map<int, PenguinMet> Methods;

    void Move();
    int p;

public:
    Penguin();
    void Walk();    
};

Penguin::Penguin()
{
    p = 0;
    Methods[0] = &Penguin::Move;
}    

void Penguin::Move()
{
    std::cout << p << std::endl;
}

void Penguin::Walk()
{
    this->*Methods[p];
    *this.*Methods[p];
}

そしてこのmain()

// Main.cpp
#include "Penguin.h"

int main()
{
    Penguin Tux;
    Tux.Walk();
    return 0;
}

しかし、私がそれを実行すると、pは印刷されません。

私は何が間違っているのですか?

ありがとう

4

2 に答える 2

4

実際に関数を呼び出しているのではなく、メンバー関数ポインターの値をvoid式として見ているだけで、効果はありません。これに変更Penguin::Walkします:

void Penguin::Walk()
{
    (this->*Methods[p])();
    (*this.*Methods[p])();
}

そうすれば、実際にメソッドを呼び出して、適切な引数(この場合はゼロの引数)を渡すことになります。->*関数呼び出しはand.*演算子よりも優先順位が高いため、追加の括弧が必要であることに注意してください。

于 2011-01-12T05:30:19.690 に答える
0

これは、関数を呼び出さないためです。

void Penguin::Walk()
{
    this->*Methods[p];
    *this.*Methods[p];
}

その関数は何もしません。

void Penguin::Walk()
{
    (this->*Methods[p])();
    (*this.*Methods[p])();
}

その関数はThingを2回呼び出します。

于 2011-01-12T05:31:50.643 に答える