我有一个似乎是工作的代码块,但不起作用。目的是由用户输入一个字符串,然后程序在地图中搜索相关函数来调用它。当我输入一个字符串时,它什么都不做。
的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
答案 0 :(得分:1)
您没有调用此功能。
函数调用需要括号来表示传递的参数(如果有)。您的尝试未显示此信息。
要通过指针调用非静态成员函数,必须使用该对象的实例调用它。你做不到。
以下是完整示例,请注意更改:
#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
将代表该函数。