Функциональные указатели в конечном автомате

У меня возникают проблемы с использованием указателей функций для реализации конечного автомата. Я продолжаю получать ошибку:

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

Я пытался добавить & на have0 в строке 51, но это ничего не сделало. Я читаю о указателях функций в течение часа и до сих пор не могу заставить его скомпилировать. Я чувствую, что мое понимание функциональных указателей довольно хорошее, но, очевидно, что-то здесь мне не хватает. Все мои функции пусты, потому что я просто пытаюсь заставить их скомпилироваться прямо сейчас, они в конечном итоге будут заполнены логикой для перемещения через конечный автомат. Любая помощь приветствуется. Вот мой код 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;}

и мой б.ч:

#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

0

Решение

Вы сделали have0 функция-член класса bтак что вы не можете просто указать на это «автономно»; он существует только по отношению к экземпляру класса (и тогда подпись не будет совпадать с сигнатурой вашего указателя на функцию, поскольку будет скрытый аргумент для передачи ссылки на сам объект).

Самое простое решение — удалить класс b в целом, особенно если учесть, что в данный момент вы не используете его ни для чего, то есть заголовок будет просто:

#include <string>

void have0(std::string);
…

И определения функций без b:: префикс.

2

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

have0, have25и т. д., которые вы определили, являются функциями-членами, поэтому для получения их адресов вам понадобится что-то вроде: &b::have0, Также обратите внимание, что вы не можете присвоить это указателю на функцию — это указатель на функцию-член, которая в некотором смысле примерно аналогична, но определенно не одно и то же (и одно не может заменить другое). ).

Другими словами, определение, которое вы в настоящее время используете state не будет работать, чтобы держать указатель на функцию-член. Кроме того, ваш код в main что пытается использовать state не будет работать для указателя на функцию-член.

Самый очевидный (и, вероятно, лучший, по крайней мере, исходя из того, что мы видим до сих пор) способ справиться с этим — это изменить b из класса в пространство имен. Вы, кажется, не планируете создавать экземпляры b в любом случае, похоже, пространство имен, вероятно, лучше соответствует вашим потребностям.

1

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