خطأ في برنامج التحويل البرمجي C++ فيما يتعلق بوظيفة من المفترض أنها غير معلنة
-
12-12-2019 - |
سؤال
أقوم حاليًا بكتابة برنامج أساسي لتقييم التعبيرات الرياضية والذي سأستخدمه لاحقًا في البرمجة الجينية لتحديد أفضل حل لنظام التعبيرات.يستمر المترجم الخاص بي في الشكوى ولكنني على يقين من أنني حصلت على كل شيء بشكل صحيح.
الخطأ:
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);