Error del compilador de C++ relacionado con una función supuestamente no declarada
-
12-12-2019 - |
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.
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);