Pregunta

Actualmente estoy escribiendo un programa básico para evaluar expresiones matemáticas que luego usaré en programación genética para determinar la mejor solución para un sistema de expresiones.Mi compilador sigue quejándose pero estoy casi seguro de que lo hice todo bien.

El error:

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

Mi archivo Make:

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

Mi 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;

}

Mi archivo de encabezado:

#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

Mi archivo de implementación:

#include "Shunt.h"

using namespace std;

void Shunt::shuntingYard(string &expr)
{
    ...
}

Por favor ayuda, estoy a punto de tirar mi computadora portátil contra la pared.

¿Fue útil?

Solución

shuntingYard() es una función de miembro no static: necesita una instancia de Shunt sobre el cual lo invoque:

Shunt s;
s.shuntingYard(expr);

Una alternativa es hacer que el miembro funcione static

Shunt::shuntingYard();

Dado que lo considere posible invocar Shunt sin una instancia, lo que lo hace shuntingYard() parece la acción más apropiada.O, si se está utilizando static para mantener las funciones aflosivamente relacionadas que comparten ningún estado y no representan las características de una abstracción específica, puede ser más apropiado usar un espacio de nombres en lugar de una clase.

Otros consejos

shuntingYard No es una función libre, sino una función miembro.Deberá llamarlo desde una instancia de la clase:

Shunt s;
s.shuntingYard(expr);

Puedes convertirlo en un static miembro de la clase y llámalo como:

Shunt::shuntingYard(expr);

Es porque la estás llamando como una función normal cuando en realidad es una función miembro y como tal necesitas una instancia de Shunt para llamarlo.

principal no sabe que shuntingYard(expr) es.Tendrás que crear un objeto de tipo Shunt antes de llamar shuntingYard(expr); sobre ese objeto.

Ha declarado shuntingYard como la función miembro de un objeto, pero está intentando llamarlo como si fuera una función libre.

Necesitas crear una nueva clase de Shunt:

Shunt my_shunt;
my_shunt.shuntingYard(expr);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top