Ошибка компилятора C ++, связанная с предположительно необъявленной функцией

В настоящее время я пишу основную программу для оценки математических выражений, которую потом буду использовать в генетическом программировании для определения наилучшего решения для системы выражений. Мой компилятор продолжает жаловаться, но я почти уверен, что у меня все правильно.

Ошибка:

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)
{
...
}

Пожалуйста, помогите, я на грани того, чтобы бросить свой ноутбук у стены.

0

Решение

shuntingYard() это неstatic функция-член: вам нужен экземпляр Shunt на котором его вызывать:

Shunt s;
s.shuntingYard(expr);

Альтернатива — сделать функцию-член static который не требует экземпляра Shunt и может быть вызван:

Shunt::shuntingYard();

Учитывая, что вы считаете возможным призвать shuntingYard() без экземпляра, делающего это static кажется более подходящим действием. Или если Shunt используется для хранения слабо связанных функций, которые не имеют общего состояния и не представляют функции конкретной абстракции; может быть более целесообразно использовать пространство имен вместо класса.

1

Другие решения

shuntingYard не свободная функция, а функция-член. Вам нужно будет вызвать его из экземпляра класса:

Shunt s;
s.shuntingYard(expr);

Вы можете сделать это static член класса и назвать его как:

Shunt::shuntingYard(expr);
1

Это потому, что вы вызываете ее как обычную функцию, когда она на самом деле является функцией-членом, и поэтому вам нужен экземпляр Shunt чтобы позвонить.

0

Главное не знает что shuntingYard(expr) является. Вам придется создать объект типа Shunt прежде чем позвонить shuntingYard(expr); на этом объекте.

0

Вы объявили shuntingYard как функция-член объекта, но вы пытаетесь вызвать его, как если бы это была свободная функция.

Вам нужно создать новый Shunt учебный класс:

Shunt my_shunt;
my_shunt.shuntingYard(expr);
0
По вопросам рекламы [email protected]