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.

È stato utile?

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);
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top