זקוק לעצה.

InfectedM

New member
זקוק לעצה.

אני צריך להגיש איזו עבודה עם מחלקות. החלטתי לעשות ספר טלפונים (עבודה עם קובץ, כמובן). אני צריך רעיון לגבי מה אוכל לממש כמחלקה(אני מתכוון לשמור את המידע בקובץ ברצף והפעולות על הקובץ יהיו get/set). תודה רבה :)
 

vinney

Well-known member
תתחיל לחשוב "אובייקטים"

מה האובייקטים במערכת שלך? האובייקטים הפיזיים, האובייקטים הלוגיים, מה יחסי גומלין וכו. עוד לפני שאתה מתעסק במחלקות. בOOP הדבר הכי חשוב זה לא התכנות, זה הDESIGN. עם DESIGN נכון תגמור את הפרוייקט בעשירית זמן ממה שאתה יכול לשרוף עליו עם DESIGN לא נכון.
 

InfectedM

New member
פעם ראשונה שאני עושה את זה... ../images/Emo3.gif

אני מניח שכל אדם אצלי ישמש כאובייקט ובו שם ומס' טלפון. הייתי הולך על רשימה אבל הרצון שלי הוא לשמור את כל הנתונים בקובץ מאורגן, כך שחלקים מסויימים ברשימה לא יהיו תקפים לגבי ההרצות הבאות של התכנית (ערכי המצביעים). אז רשימה ירדה מהפרק. אז לדעתי האובייקט היחיד שיש לי בתוכנית זה "אדם" שמכיל שם ומס' טלפון. מצד שני, אני לא כ"כ רואה איך לקשר את זה לעובדה שאני צריך לשמור את הנתונים באיזשהו קובץ. הרי אין לי פה צורך מיוחד במבנה הספציפי של מחלקה, אוכל באותה מידה להשתמש באיזו רשומה. זו הפעם הראשונה שאנחנו צריכים להתמודד לבד עם העיצוב. עד עכשיו בכל התרגילים היה מפורט איך הכל אמור להראות. חוסו עליי
 

vinney

Well-known member
ירושה זה דבר מופלא

ישנם אובייקטים שיודעים לשמור את עצמם (SERIALIZED). אני לא יודע באיזו שפה אתה כותב, אבל אני בטוח שתדע להבין על מה אני מדבר. אובייקטים כאלה מבינים אופרטורים כמו >> ו<< או מה שיש מקביל בשפה בה אתה עובד. תירש את האובייקטים שלך, תשלים את המידע החסר, והנה לך האובייקט שלך שומר ומשחזר את עצמו מהקובץ. כל אובייקט זה ישות נפרדת, נשמר בקובץ בנפרד ומועלה מקובץ בנפרד. פנקס טלפונים זה באמת משהו פשוט, אבל אתה יכול להוסיף לזה יומן פגישות, והרי לך קיבלת משימה עם מס' אובייקטים, קשרים ותלויות
 

InfectedM

New member
אה, ידעתי ששכחתי משהו! ../images/Emo122.gif

אני כותב ב C++. אני חושב שלא הבנתי כ"כ למה התכוונת. תוכל להמחיש בפשטות? :) חשבתי בהתחלה על העניין של יומן פגישות, אבל ויתרתי על זה לטובת אחד מהכיתה שלא היה לו רעיון לפרוייקט
 

vinney

Well-known member
תסתכל

יש לך למשל דבר כזה:
std::string s("String"); cout << s;​
מה קורא פה? מה זה COUT? מה זה S? מה קורה ל>> ומה בעצם פועל פה? עכשיו תציב במקום COUT את הקובץ שלך, במקום S את המחלקה שלך - זה מה שאתה צריך לעשות.
 

InfectedM

New member
ירושה - האם אפשר לירוש מחלקה באופן

חלקי? יש את ofstream ואני רוצה לירוש רק חלש ממנה. זה אפשרי בכלל?
 

GuestOfHonor

New member
לא, אבל

אם המחלקה שאתה רוצה לרשת ממנה יורשת בעצמה ממחלקה מצומצמת יותר שכן כוללת רק מה שאתה צריך, אז אתה יכול לרשת מהמחלקה ה'מצומצמת'.
 

InfectedM

New member
עוד שאלה - חיפשתי וחיפשתי פונקציה

שתאפשר לי למחוק מידע ספציפי מקובץ ולא מצאתי דבר כזה. o_O בכלל, כל הדברים שמצאתי על טיפול בקבצים ב C++ הם לא מספיק low-level. אני רוצה לרדת לרמה של התעסקות במצביעים עצמם ובמידע שיש בקובץ(שוב, כדי למחוק ממנו מידע), ולא לכתוב אליו ולקרוא ממנו באופן כללי כ"כ. האם יש פונקציה כזו כלל? תודה :)
 

טיורינג

New member
לא יודע

אבל אתה יכול לקרוא את הקובץ ואז לכתוב אותו מחדש בלי המידע שרצית למחוק.
 

operandx

New member
אולי תחפש משהו בכיוון של File Map

זה מאפשר לך למפות קובץ לכתובת בזכרון. הקובץ ננעל, אתה יכול לבצע שינויים, להגדיר מחדש את גודל הקובץ וכו'. אילו עוד דברים אתה רוצה למחוק? מה שנשאר הוא כבר ברמה של ה File System.
 

InfectedM

New member
שוב ירושה - עוד בעיה

ניסיתי ליצור מחלקה בשם OPhoneBook שיורשת מ ofstream בצורה הזו:
class OPhoneBook : public ofstream { public: OPhoneBook(){ }; OPhoneBook(const char* szName, int nMode = ios::eek:ut) : ofstream(szName,nMode) { }; };​
את הגדרת הבנאים העתקתי באופן מדוייק מ MSDN ושלחתי את מה שאני צריך לבנאי של ofstream. הקטע הספציפי הזה עבד, אבל גיליתי שהמחלקה שלי לא ירשה את כל התכונות של ofstream. למה זה? האם אצטרך להעתיק את כל הגדרות הפונקציות ולממשן כפי שעשיתי עם הבנאים? אם כן, מה לגבי האופרטור >>? תודה :)
 

vinney

Well-known member
תגדיר "לא ירשה את כל התכונות"

מה זה אומר ואיך גילית את זה?
 

InfectedM

New member
מקווה שזה עוד קופץ... הממ

הכוונה שלי היא שהאובייקט שיצרתי מהמחלקה שלי (שיורשת מ ofstream) לא מכיל את כל הפונקציות שיש ב ofstream. הן פשוט לא קיימות במחלקה היורשת, הייתי צריך להגדיר את הפונקציות מחדש במחלקה שלי ואז לשלוח את הפרמטרים שהמחלקה שלי מקבלת לפונקציות של ofstream. חוץ מזה, אני גם לא יודע איך להגדיר שהמחלקה שלי תקבל את האופרטור >> (שוב, כדי לשלוח ל ofstream).
 

ahab

New member
ושוב...

איך גילית שהמחלקה שלך לא מכילה את הפונקציות שהן public ו-protected בofstream? אתה יכול לתת קטע קוד קצר שמשתמש במחלקה שלך, ושלא מתקמפל.
 

InfectedM

New member
לא משנה, זה הסתדר :)+עוד בעיה

חשבתי שזה לא ירש את הפונקציות של fstream כי כשרשמתי את שם האובייקט ונקודה אחריו לא הופיעה לי רשימת הפונקציות שאני יכול לזמן. בכל אופן, יש לי בעיה אחרת. אחרי שהעברתי את המחלקה שלי לקובץ header לא הצלחתי לקמפל את הפרוייקט. הוא לא מזהה את המחלקה fstream בכלל. כך נראה ההדר:
phone.h: #include <fstream> class OPhoneBook : public ofstream { public: OPhoneBook(){ }; OPhoneBook(const char* szName, int nMode = ios::eek:ut) : ofstream(szName,nMode) { }; };​
וכך נראה הקובץ הראשי:
main.cpp: #include <fstream> #include <iostream> #include "phone.h" using namespace std; int main(void) { return 1; }​
ואלה השגיאות שאני מקבל:
error C2504: 'ofstream' : base class undefined error C2653: 'ios' : is not a class or namespace name error C2065: 'out' : undeclared identifier​
כל השגיאות מצביעות על קובץ ההדר. למה זה קורה? תודה :)
 
למעלה