Ошибка компилятора C++, связанная с предположительно необъявленной функцией
-
12-12-2019 - |
Вопрос
В настоящее время я пишу базовую программу для вычисления математических выражений, которую позже буду использовать в генетическом программировании, чтобы определить лучшее решение системы выражений.Мой компилятор продолжает жаловаться, но я почти уверен, что все сделал правильно.
Ошибка:
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
Мой 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
Мой основной:
#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;
}
Мой заголовочный файл:
#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
Мой файл реализации:
#include "Shunt.h"
using namespace std;
void Shunt::shuntingYard(string &expr)
{
...
}
Пожалуйста, помогите, я вот-вот швырну свой ноутбук о стену.
Решение
shuntingYard()
является не-static
функция-член:вам нужен экземпляр Shunt
для его вызова:
Shunt s;
s.shuntingYard(expr);
Альтернативой является создание функции-члена static
который не требует экземпляра Shunt
и может быть вызван:
Shunt::shuntingYard();
Учитывая, что вы считаете возможным вызвать shuntingYard()
без экземпляра, делающего это static
кажется более подходящим действием.Или если Shunt
используется для хранения слабо связанных функций, которые не имеют общего состояния и не представляют особенности конкретной абстракции, возможно, более целесообразным будет использовать пространство имен вместо класса.
Другие советы
shuntingYard
не является бесплатной функцией, а функция элементов.Вам нужно позвонить в это из экземпляра класса:
Shunt s;
s.shuntingYard(expr);
.
Вы можете сделать его элементом генеракодицетагкода класса и вызывать его как:
Shunt::shuntingYard(expr);
. Это потому, что вы называете его как обычная функция, когда на самом деле она на самом деле является функцией элементов, и, как таковой, вам нужен экземпляр Shunt
, чтобы вызвать его.
Главная не знает, что такое генеракодицетагкод.Вам придется создать объект типа shuntingYard(expr)
, прежде чем вызовите Shunt
на этом объекте.
Вы объявили shuntingYard
в качестве функции элементов объекта, но вы пытаетесь вызвать его, как если бы это была бесплатная функция.
Вам нужно создать новый класс Shunt
:
Shunt my_shunt;
my_shunt.shuntingYard(expr);
.