خطأ في برنامج التحويل البرمجي 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

ملف التعريف الخاص بي:

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

يمكنك جعلها أ static عضو في الفصل ونسميه على النحو التالي:

Shunt::shuntingYard(expr);

.

الرئيسي لا يعرف ماذا shuntingYard(expr) يكون.سيكون عليك إنشاء كائن من النوع Shunt قبل الاتصال shuntingYard(expr); على هذا الكائن.

لقد أعلنت shuntingYard كوظيفة عضو لكائن ولكنك تحاول تسميتها كما لو كانت وظيفة مجانية.

تحتاج إلى إنشاء جديد Shunt فصل:

Shunt my_shunt;
my_shunt.shuntingYard(expr);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top