протоколы — передача строки в качестве ссылки на указатель на функцию переполнения стека

Ниже мой код

 #include "stdafx.h"#include <string.h>
#include <iostream.h>

using namespace std;

class ToDoCommands
{
public:
void getCommand(string);
};

void ToDoCommands::getCommand(string command)
{
cout<<command;   //here i get ping
void (*CommandToCall)(void);
CommandToCall = command; // error here i want something like
//  CommandToCall = ping
CommandToCall();
}

void ping(void)
{
cout<<"ping command executed";
}

int main()
{
ToDoCommands obj;
obj.getCommand("ping");
}

Указатель на функцию должен динамически ссылаться на функцию ping. Строка, такая же как имя функции, передается функции getCommand в main.

0

Решение

С ++ просто так не работает. Если вам действительно нужно что-то подобное, вам нужно составить таблицу функций, которые проиндексированы по имени:

#include <assert.h>
#include <iostream>
#include <map>
#include <string>

using std::cout;
using std::string;
using std::map;

void ping(void)
{
cout << "ping command executed\n";
}

class ToDoCommands
{
public:
typedef void (*FunctionPtr)();
typedef string Name;

void registerFunction(Name name,FunctionPtr);
void callFunction(Name);

private:
map<Name,FunctionPtr> func_map;
};

void ToDoCommands::registerFunction(Name name,FunctionPtr func_ptr)
{
func_map[name] = func_ptr;
}

void ToDoCommands::callFunction(Name name)
{
assert(func_map.find(name)!=func_map.end());
func_map[name]();
}

int main(int argc,char **argv)
{
ToDoCommands to_do_commands;

to_do_commands.registerFunction("ping",ping);
to_do_commands.callFunction("ping");
return 0;
}
1

Другие решения

void ping(void)
{
//  LL  DD…DD   XX
cout<<"ping command executed"<<endl;
}

class ToDoCommands
{
public:
void getCommand( void (*CommandToCall)(void));  //getCommand(ping)
};

void ToDoCommands::getCommand( void (*CommandToCall)(void) )
{
void (*CommandToCall1)(void);
CommandToCall1  = CommandToCall;
CommandToCall1();
}

int main()
{
ToDoCommands obj;
obj.getCommand( ping );
return 0;
}

Я попробовал это, и это работает 🙂

0

По вопросам рекламы [email protected]