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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top