【问题标题】:Calling a method on a map from another method从另一个方法调用地图上的方法
【发布时间】:2011-01-12 05:23:37
【问题描述】:
// 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 永远不会被打印出来。

我做错了什么?

谢谢

【问题讨论】:

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


    【解决方案1】:

    您实际上并没有调用函数,您只是将成员函数指针的值视为 void 表达式,这没有任何作用。将Penguin::Walk 更改为:

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

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

    【讨论】:

    • 谢谢,顺便说一下 (*this.*Methods[p])();不起作用,我收到访问冲突错误。你知道可能是什么吗?
    • @levin: (*this.*Methods[p])() 在语义上与(this-&gt;*Methods[p])() 相同。它会出现段错误的唯一原因是如果p 在地图中还不存在,所以operator[] 插入一个默认值NULL,然后你取消引用它;但是在这种情况下,两个方法调用都会出现段错误。
    【解决方案2】:

    那是因为你从不调用函数。

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

    那个函数什么都不做。

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

    那个函数调用了这个东西两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多