C++-Compilerfehler bezüglich einer vermeintlich nicht deklarierten Funktion
-
12-12-2019 - |
Frage
Ich schreibe derzeit ein Basisprogramm zur Auswertung mathematischer Ausdrücke, das ich später in der genetischen Programmierung verwenden werde, um die beste Lösung für ein System von Ausdrücken zu ermitteln.Mein Compiler beschwert sich ständig, aber ich bin mir fast sicher, dass ich alles richtig gemacht habe.
Der Fehler:
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
Mein 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
Mein Haupt:
#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;
}
Meine Header-Datei:
#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
Meine Implementierungsdatei:
#include "Shunt.h"
using namespace std;
void Shunt::shuntingYard(string &expr)
{
...
}
Bitte helfen Sie mir, ich bin kurz davor, meinen Laptop gegen die Wand zu schmeißen.
Lösung
shuntingYard()
ist ein Nicht-static
Mitgliedsfunktion:Sie benötigen eine Instanz von Shunt
wo man es aufrufen kann:
Shunt s;
s.shuntingYard(expr);
Eine Alternative besteht darin, die Memberfunktion zu übernehmen static
wofür keine Instanz von erforderlich ist Shunt
und kann aufgerufen werden:
Shunt::shuntingYard();
Vorausgesetzt, Sie halten es für möglich, sich darauf zu berufen shuntingYard()
ohne dass eine Instanz es schafft static
scheint die angemessenere Maßnahme zu sein.Oder wenn Shunt
Wird verwendet, um lose verwandte Funktionen zu speichern, die keinen gemeinsamen Status haben und nicht die Merkmale einer bestimmten Abstraktion darstellen. Möglicherweise ist die Verwendung eines Namespace anstelle einer Klasse angemessener.
Andere Tipps
shuntingYard
ist keine freie Funktion, sondern eine Mitgliedsfunktion.Sie müssen es von einer Instanz der Klasse anrufen:
Sie können es zu einem static
-Mitglied der Klasse machen und anrufen als:
Das liegt daran, dass Sie sie wie eine reguläre Funktion aufrufen, obwohl es sich tatsächlich um eine Mitgliedsfunktion handelt und Sie daher eine Instanz von benötigen Shunt
es anzurufen.
Main weiß nicht was shuntingYard(expr)
Ist.Sie müssen ein Objekt vom Typ erstellen Shunt
bevor Sie anrufen shuntingYard(expr);
auf diesem Objekt.
Du hast erklärt shuntingYard
als Mitgliedsfunktion eines Objekts, aber Sie versuchen, es so aufzurufen, als wäre es eine freie Funktion.
Sie müssen ein neues erstellen Shunt
Klasse:
Shunt my_shunt;
my_shunt.shuntingYard(expr);