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.

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top