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

オブジェクトのメンバー関数として宣言shuntingYardしましたが、それがフリー関数であるかのように呼び出そうとしています。

Shunt新しいクラスを作成する必要があります。

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

これは、実際にはメンバー関数である場合に通常の関数のように呼び出しているため、呼び出すには のインスタンスが必要なためですShunt

于 2012-10-02T15:16:19.553 に答える
0

メインは何が何だかわからないshuntingYard(expr)Shuntそのオブジェクトを呼び出す前に、タイプのオブジェクトを作成する必要がありshuntingYard(expr);ます。

于 2012-10-02T15:20:27.897 に答える