0

我在使用函数指针来实现有限状态机时遇到了麻烦。我不断收到错误:

b.cpp: In function ‘int main()’:
b.cpp:51: error: ‘have0’ was not declared in this scope

我尝试在第 51 行的 has0 中添加一个 &,但这并没有做任何事情。我已经阅读了一个小时的函数指针,但我仍然无法编译它。我觉得我对函数指针的理解非常好,但显然我在这里缺少一些东西。我所有的函数都是空白的,因为我现在只是想让它编译,它们最终将充满逻辑以通过有限状态机。任何帮助表示赞赏。这是我的 b.cpp 代码:

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

using namespace std;
typedef void (*state)(string);
state current_state;

void b::have0(string input)
{
    if(input == "quarter"){

    }
}

void b::have25(string input)
{
}
void b::have50(string input)
{
}
void b::have75(string input)
{
}
void b::have100(string input)
{
}
void b::have125(string input)
{
}
void b::have150(string input)
{
}

void b::owe50(string input)
{
}
void b::owe25(string input)
{
}
int main()
{

    string inputString;
    // Initial state.
    cout <<"Deposit Coin: ";
    cin >> inputString;
    cout << "You put in a "+inputString+"." << endl;
    current_state = have0;
    // Receive event, dispatch it, repeat
    while(1)
    {


        if(inputString == "exit")
        {
            exit(0);
        }

        // Pass input to function using Global Function Pointer
        (*current_state)(inputString);
        cout <<"Deposit Coin: ";
        cin >> inputString;
        cout << "You put in a "+inputString+"." << endl;

    }
    return 0;   


}

和我的 bh:

#ifndef B_H
#define B_H

#include <string>
class b{

public:

    void have0(std::string);
    void have25(std::string);
    void have50(std::string);
    void have75(std::string);
    void have100(std::string);
    void have125(std::string);
    void have150(std::string);
    void have175(std::string);
    void have200(std::string);
    void have225(std::string);
    void owe125(std::string);
    void owe100(std::string);
    void owe75(std::string);
    void owe50(std::string);
    void owe25(std::string);


};
#endif
4

2 回答 2

2

你已经创建了have0一个 class 的成员函数b,所以你不能仅仅指向它“独立”;它仅与类的实例相关(然后签名将与您的函数指针的签名不匹配,因为将有一个隐藏参数将引用传递给对象本身)。

最简单的解决方法是完全删除该类b,特别是因为您目前似乎没有将它用于任何东西,即标题将只是:

#include <string>

void have0(std::string);
…

b::以及没有前缀的函数定义。

于 2013-02-16T06:26:27.847 回答
1

您定义的have0,have25等都是成员函数,因此要获取它们的地址,您需要类似&b::have0:但是,还要注意,您不能将其分配给指向函数的指针——它是指向成员函数的指针,这在某些方面大致相似,但绝对不是一回事(也不能用一个替代另一个)。

换句话说,您当前使用的定义state无法保存指向成员函数的指针。同样,您main尝试使用的代码state不适用于指向成员函数的指针。

处理这个问题的最明显(并且可能是最好的,至少基于我们目前所见)的方法是b从类更改为命名空间。无论如何,您似乎并不打算创建实例b,因此看起来命名空间可能更适合您的需求。

于 2013-02-16T06:25:44.273 回答