Errore del compilatore C ++ relativo a una funzione presumibilmente non dichiarata
-
12-12-2019 - |
Domanda
Attualmente sto scrivendo un programma di base per valutare le espressioni matematiche che utilizzerò in seguito nella programmazione genetica per determinare la migliore soluzione a un sistema di espressioni.Il mio compilatore continua a lamentarsi, ma sono quasi sicuro che ho tutto a posto.
L'errore:
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
.
My 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
.
La mia principale:
#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;
.
}
Il mio file di intestazione:
#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
.
Il mio file di implementazione:
#include "Shunt.h"
using namespace std;
void Shunt::shuntingYard(string &expr)
{
...
}
.
Aiuta Aiuto Sono sull'orlo di chucking il mio laptop contro il muro.
Soluzione
shuntingYard()
è una funzione membro non static
: è necessaria un'istanza di Shunt
su cui richiamarlo:
Shunt s;
s.shuntingYard(expr);
.
Un'alternativa è effettuare la funzione membro static
che non richiede un'istanza di Shunt
e può essere invocato:
Shunt::shuntingYard();
.
Dato che si ritiene possibile richiamare shuntingYard()
senza un'istanza che renderlo static
sembra l'azione più appropriata.Oppure, se Shunt
viene utilizzato per contenere funzioni correlate che condividono nessuno stato e non rappresentano le caratteristiche di una specifica astrazione è può essere più appropriata per utilizzare uno spazio dei nomi invece di una classe.
Altri suggerimenti
shuntingYard
non è una funzione gratuita, ma una funzione membro.Dovrai chiamarlo da un'istanza della classe:
Shunt s;
s.shuntingYard(expr);
.
Puoi renderlo un membro static
della classe e chiamarlo come:
Shunt::shuntingYard(expr);
. È perché lo stai chiamando come una funzione regolare quando è in realtà una funzione membro e come tale, è necessario un'istanza di Shunt
per chiamarlo.
Main non sa cosa sia shuntingYard(expr)
.Dovrai creare un oggetto di tipo Shunt
prima di chiamare shuntingYard(expr);
su quell'oggetto.
Hai dichiarato shuntingYard
come funzione membro di un oggetto ma stai tentando di chiamarlo come se fosse una funzione libera.
È necessario creare una nuova classe Shunt
:
Shunt my_shunt;
my_shunt.shuntingYard(expr);
.