Вызов метода на карте из другого метода - PullRequest
2 голосов
/ 12 января 2011
// 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 ]

4 голосов
/ 12 января 2011

Вы на самом деле не вызываете функцию, вы просто смотрите на значение указателя на функцию-член как на выражение void, которое не имеет никакого эффекта.Измените Penguin::Walk на следующее:

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

Таким образом, вы фактически вызываете метод и передаете правильные аргументы (в данном случае нулевые аргументы).Обратите внимание, что вам нужны дополнительные скобки, поскольку вызовы функций имеют более высокий приоритет, чем операторы ->* и .*.

0 голосов
/ 12 января 2011

Это потому, что вы никогда не вызываете функцию.

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

Эта функция ничего не делает.

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

Эта функция вызывает вещь дважды.

...