gpt4 book ai didi

参数数量未知的 C++ 函数指针

转载 作者:可可西里 更新时间:2023-11-01 16:36:36 31 4
gpt4 key购买 nike

我需要一些 C++ 方面的帮助!

我正在为一个基于文本的小型游戏编写命令解析器,但遇到了一些问题。解析器应该读取和解析玩家输入的命令。

对此最明显和直接的解决方案可能是这样的(用伪代码编写):

command <- read input from the player
if command == COMMAND1
do command1
else if command == COMMAND 2
do command2
...

我正在用 C++ 编写,所以我想我可以通过使用关联映射和函数指针来解决这个问题。我不太熟悉使用函数指针,所以这可能就是我遇到问题的原因。我想要做的是有某种等待输入的循环,解析插入的输入,并根据给定的命令调用函数。下面是一些 C++ 风格的伪代码,描述了我的想法:

while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
... // here, I get stuck on what to do..
}

所以我希望我能清楚地说明我想要发生什么。玩家可能已经输入了类似

> go south

我可以用类似的东西来完成代码:

destination = strtok(NULL, " ");
fptr(destination);

基本上,从 map 返回的值将是执行命令“go”的函数,并且该函数显然接受一个参数,即目的地。同样,这是一些 C++ 伪代码。所以我得到了命令“go”。但是现在说我想要以下命令:

> attack troll with sword

现在我觉得我需要做这样的事情:

while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
if(tok == "go"){
destination = strtok(NULL, " ");
fptr(destination);
} else if (tok == "attack") {
target = strtok(NULL, " ");
weapon = strtok(NULL, " ");
fptr(target, weapon);
}
}

同样,这是伪代码。你可能看到我挂断了什么:我有这个函数指针映射,但是因为我有可变数量的参数和参数类型,因为我想根据我得到的输入调用不同的函数,所以我可以'我只是在没有映射和函数指针的情况下完成了此操作,就像我首先向您展示的那样。有什么方法可以使它更通用,而不必使用一些 if-else 子句来确定要传递多少参数?

我希望你明白我需要什么帮助:)感谢你的阅读!

最佳答案

您可以更改您的设计以遵循命令设计模式,并让您的函数/命令对象执行参数解析,而不是让您的主循环读取“被动”函数所需的所有参数。这样您就无需预先知道函数的签名。

您可以使用责任链找到合适的 Command,并让 Command 消耗下一个 token 。

一个例子,使用流而不是 strtok(我们这里用的是 C++,对吧?)- 警告:未编译、未测试、C++ 类伪代码:

struct ICommand {
// if cmd matches this command,
// read all needed tokens from stream and execute
virtual bool exec( string cmd, istream& s ) = 0;
};

struct Command : public ICommand {
string name;
Command( string name ):name(name){}
virtual bool exec( string cmd, istream& s ) {
if( cmd != name ) return false;
parse_and_exec( s );
return true;
}
virtual void parse_and_exec( istream& s ) = 0;
};

一个实现的命令:

struct Go : public Command {
Go():Command("Go"){}

virtual void parse_and_exec( istream& s ) {
string direction;
s >> direction;
... stuff with direction
}
};

还有一些主循环:

 ICommand* commands [] = 
{ new Go()
, new Attack()
, new PickUp()
...
, NULL // a sentinel
};

string cmd;
cin >> cmd;
while( cmd != "quit" ) {
// find a command that can handle it
// note: too simple to handle erroneous input, end of stream, ...
for( ICommand* c = commands; c != NULL && !c->exec(cmd, cin); ++c );
cin >> cmd;
}

你可以用更强的效用函数等来完善这个想法......

如果您期望一个非常困难的语法,那么最好转向“真正的”解析器框架,例如boost::spirit .

关于参数数量未知的 C++ 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4234415/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com