从另一个方法调用地图上的方法

时间:2011-01-12 05:23:37

标签: c++ map member-function-pointers

// 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.cpp
#include "Penguin.h"

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

但是当我运行它时, p 永远不会打印出来。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:4)

你实际上并没有调用函数,你只是将成员函数指针的值看作一个void表达式,它没有任何效果。将Penguin::Walk更改为:

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

这样你实际上调用了方法并传入了正确的参数(在这种情况下为零参数)。请注意,您需要额外的括号,因为函数调用的优先级高于->*.*运算符。

答案 1 :(得分:0)

那是因为你从不打电话给这个功能。

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

该功能无效。

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

该函数调用该东西两次。