Erreur du compilateur C++ concernant une fonction soi-disant non déclarée
-
12-12-2019 - |
Question
J'écris actuellement un programme de base pour évaluer des expressions mathématiques que j'utiliserai ensuite en programmation génétique pour déterminer la meilleure solution à un système d'expressions.Mon compilateur n'arrête pas de se plaindre mais je suis presque sûr que tout est correct.
L'erreur:
C:\Users\Baelic Edeyn\Desktop\Project\Equation\Shunting yard\Better>make
g++ -g -c Shunt.cpp
g++ -g -c main.cpp
main.cpp: In function 'int main()':
main.cpp:18:19: error: 'shuntingYard' was not declared in this scope
make: *** [main.o] Error 1
Mon Makefile :
main: Shunt.o main.o
g++ -g Shunt.o main.o -o main
main.o:main.cpp
g++ -g -c main.cpp
Shunt.o:Shunt.cpp
g++ -g -c Shunt.cpp
Mon principal:
#include "Shunt.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
string expr = "3+ 47 *2/(1-5)^2^3";
string expr1 = "a+b";
string expr2 = "(a+b)";
string expr3 = "a+b*!3";
string expr4 = "(a+b)*!3";
cout << "expression" << " " << "postfix" << endl;
cout << expr << " ";
shuntingYard(expr);
cout << expr << endl;
cout << expr1 << " ";
...
return 0;
}
Mon fichier d'en-tête :
#ifndef SHUNT_H
#define SHUNT_H
#include <string>
using namespace std;
class Shunt
{
public:
int precedence(char);
void shuntingYard(string &expr);
bool isFunction(string);
bool isOperator(char);
bool isLeftAssociative(char);
bool isNum(char);
private:
};
#endif
Mon dossier d'implémentation :
#include "Shunt.h"
using namespace std;
void Shunt::shuntingYard(string &expr)
{
...
}
S'il vous plaît, aidez-moi, je suis sur le point de jeter mon ordinateur portable contre le mur.
La solution
shuntingYard()
est un non-static
fonction membre :vous avez besoin d'une instance de Shunt
sur lequel l'invoquer :
Shunt s;
s.shuntingYard(expr);
Une alternative est de faire fonctionner le membre static
qui ne nécessite pas d'instance de Shunt
et peut être invoqué :
Shunt::shuntingYard();
Étant donné que vous jugez possible d'invoquer shuntingYard()
sans qu'une instance le fasse static
semble l'action la plus appropriée.Ou si Shunt
est utilisé pour contenir des fonctions vaguement liées qui ne partagent aucun état et ne représentent pas les caractéristiques d'une abstraction spécifique. Il peut être plus approprié d'utiliser un espace de noms au lieu d'une classe.
Autres conseils
shuntingYard
n'est pas une fonction libre, mais une fonction membre.Vous devrez l'appeler depuis une instance de la classe :
Shunt s;
s.shuntingYard(expr);
Vous pouvez en faire un static
membre de la classe et appelez-le comme suit :
Shunt::shuntingYard(expr);
C'est parce que vous l'appelez comme une fonction régulière lorsqu'elle est en fait une fonction de membre et, en tant que telle, vous avez besoin d'une instance de Shunt
pour l'appeler.
Principal ne sait pas quoi shuntingYard(expr)
est.Vous devrez créer un objet de type Shunt
avant d'appeler shuntingYard(expr);
sur cet objet.
Vous avez déclaré shuntingYard
en tant que fonction membre d'un objet mais vous essayez de l'appeler comme s'il s'agissait d'une fonction gratuite.
Vous devez créer un nouveau Shunt
classe:
Shunt my_shunt;
my_shunt.shuntingYard(expr);