C ++ map <string,function =“”> </string,>

时间:2014-09-30 14:51:30

标签: c++ map

我有一个似乎是工作的代码块,但不起作用。目的是由用户输入一个字符串,然后程序在地图中搜索相关函数来调用它。当我输入一个字符串时,它什么都不做。

的main.cpp

#include "getTime.h"
#include <iostream>
#include <map>
#include <string>

using namespace std;

typedef string KeyType;
typedef void(getTime::*DoFunc)(void);
typedef pair<const KeyType, DoFunc> Pair;
typedef map<KeyType, DoFunc> mapTimeCall;

int main() {

    string input;
    getTime* getTheTime;

    mapTimeCall callTimeMap;

    callTimeMap.insert(Pair("printCurrentTime()", &getTime::printCurrentTime));
    callTimeMap.insert(Pair("printCurrentDate()", &getTime::printCurrentDate));

    cout << "Enter command: ";
    getline(cin, input);
    cout << endl;

    mapTimeCall::const_iterator x;

    x = callTimeMap.find(input);

    if (x != callTimeMap.end()) {
        (*x).second;
    }

    system("pause");

    return 0;
}

我将(*x).second;更改为getTheTime.*(x->second)();,我收到错误Expression preceding parentheses of apparent call must have (pointer-to) function type

getTime.h

#ifndef H_getTime
#define H_getTime

#include <time.h>
#include <string>

using namespace std;

class getTime {

public:
    void printCurrentTime();
    void printCurrentDate();

private:
    string currentTime;
    string currentDate;
    int hours;
    int minutes;
    int seconds;
    int day;
    int month;
    int year;
    string strMonth;
    time_t now;
    struct tm *current;

}; 

#endif

1 个答案:

答案 0 :(得分:1)

您没有调用此功能。

  1. 函数调用需要括号来表示传递的参数(如果有)。您的尝试未显示此信息。

  2. 要通过指针调用非静态成员函数,必须使用该对象的实例调用它。你做不到。

  3. 以下是完整示例,请注意更改:

    #include <map>
    #include <string>
    #include <iostream>
    
    struct getTime
    {
        void printCurrentTime() { std::cout << "Here is the time\n"; }
        void printCurrentDate() { std::cout << "Here is the date\n"; }
    };
    
    typedef void(getTime::*DoFunc)(void);
    typedef std::pair<std::string, DoFunc> Pair;
    typedef std::map<std::string, DoFunc> mapTimeCall;
    
    int main() 
    {
        getTime getTheTime;
        getTime* pGetTheTime = &getTheTime;
        mapTimeCall callTimeMap;
        callTimeMap.insert(Pair("printCurrentTime()", &getTime::printCurrentTime));
        callTimeMap.insert(Pair("printCurrentDate()", &getTime::printCurrentDate));
        mapTimeCall::const_iterator x;
        x = callTimeMap.find("printCurrentTime()");
    
        if (x != callTimeMap.end()) 
        {
            (getTheTime.*(x->second))();  // call using object
            (pGetTheTime->*(x->second))();  // call using pointer
        }
    }
    

    输出:

    Here is the time
    Here is the time
    

    通过指针调用非静态成员函数的基本语法是:

    (object.*fnPtr)(args);
    

    或者如果object是指针:

    (object->*fnPtr)(args);
    

    由于x->second是您的函数指针,因此fnPtr将代表该函数。