Erro do compilador C++ relativo a uma função supostamente não declarada
-
12-12-2019 - |
Pergunta
Atualmente estou escrevendo um programa básico para avaliar expressões matemáticas que utilizarei posteriormente em programação genética para determinar a melhor solução para um sistema de expressões.Meu compilador continua reclamando, mas tenho quase certeza de que acertei tudo.
O erro:
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
Meu 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
Meu 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;
}
Meu arquivo de cabeçalho:
#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
Meu arquivo de implementação:
#include "Shunt.h"
using namespace std;
void Shunt::shuntingYard(string &expr)
{
...
}
Por favor, ajude, estou prestes a jogar meu laptop contra a parede.
Solução
shuntingYard()
é um não-static
função de membro:você precisa de uma instância de Shunt
em que invocá-lo:
Shunt s;
s.shuntingYard(expr);
Uma alternativa é fazer a função membro static
que não requer uma instância de Shunt
e pode ser invocado:
Shunt::shuntingYard();
Dado que você considera possível invocar shuntingYard()
sem uma instância fazendo isso static
parece ser a acção mais apropriada.Ou se Shunt
está sendo usado para manter funções vagamente relacionadas que não compartilham nenhum estado e não representam os recursos de uma abstração específica. Pode ser mais apropriado usar um namespace em vez de uma classe.
Outras dicas
shuntingYard
não é uma função livre, mas uma função membro.Você precisará chamá-lo de uma instância da classe:
Shunt s;
s.shuntingYard(expr);
Você pode fazer disso um static
membro da classe e chame-o como:
Shunt::shuntingYard(expr);
É porque você a está chamando como uma função regular quando na verdade é uma função membro e, como tal, você precisa de uma instância de Shunt
para ligar.
Principal não sabe o que shuntingYard(expr)
é.Você terá que criar um objeto do tipo Shunt
antes de ligar shuntingYard(expr);
naquele objeto.
Você declarou shuntingYard
como função membro de um objeto, mas você está tentando chamá-lo como se fosse uma função livre.
Você precisa criar um novo Shunt
aula:
Shunt my_shunt;
my_shunt.shuntingYard(expr);