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

StackOverflow https://stackoverflow.com//questions/12693148

Вопрос

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

Ошибка:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top