0

我目前正在编写一个基本程序来评估数学表达式,然后我将在遗传编程中使用它来确定表达式系统的最佳解决方案。我的编译器一直在抱怨,但我几乎可以肯定我做的一切都是正确的。

错误:

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

我的制作文件:

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

请帮助我即将把我的笔记本电脑靠在墙上。

4

5 回答 5

1

shuntingYard()是一个非static成员函数:您需要一个实例Shunt来调用它:

Shunt s;
s.shuntingYard(expr);

static另一种方法是制作不需要实例Shunt并且可以调用的成员函数:

Shunt::shuntingYard();

鉴于您认为可以在shuntingYard()没有实例的情况下进行调用,这static似乎是更合适的操作。或者,如果Shunt用于保存松散相关的函数,这些函数不共享状态并且不表示特定抽象的特征,则使用命名空间而不是类可能更合适。

于 2012-10-02T15:16:06.277 回答
1

shuntingYard不是自由函数,而是成员函数。您需要从类的实例中调用它:

Shunt s;
s.shuntingYard(expr);

您可以使其成为static该类的成员并将其称为:

Shunt::shuntingYard(expr);
于 2012-10-02T15:16:31.083 回答
0

这是因为当它实际上是成员函数时,您像常规函数一样调用它,因此您需要一个实例Shunt来调用它。

于 2012-10-02T15:16:19.553 回答
0

您已声明shuntingYard为对象的成员函数,但您试图将其作为自由函数来调用。

您需要创建一个新Shunt类:

Shunt my_shunt;
my_shunt.shuntingYard(expr);
于 2012-10-02T15:17:28.430 回答
0

主不知道是什么shuntingYard(expr)Shunt在调用该对象之前,您必须创建一个类型shuntingYard(expr);的对象。

于 2012-10-02T15:20:27.897 回答