נתקלתי לראשונה ב- ++C וב- Object Oriented Programming, במסגרת קורס. אני זוכר בעיקר את שתי המנטרות עליהם חזר המרצה כל הזמן: Data Encapsulation ו- Information Hiding.
הפוסט הזה מציג את נושא ה-class ב-c++. אז כאות הוקרה לאותו מרצה אתחיל במשפט: class הוא הפלטפורמה הבסיסית למימוש יכולות ה-Data Encapsulation וה-Information Hiding.
הפוסט הזה מציג את נושא ה-class ב-c++. אז כאות הוקרה לאותו מרצה אתחיל במשפט: class הוא הפלטפורמה הבסיסית למימוש יכולות ה-Data Encapsulation וה-Information Hiding.
מה היה המצב לפני הופעת ה- Object Oriented Programming? היה אז תכנות פרוצדורלי. אוסף של פונקציות שמשתמשות בבסיסי נתונים. השאיפה למימוש מושגים כמו Data Encapsulation ו- Information Hiding היתה קיימת, אבל היא לא היתה מובנית. החידוש ב-OOP, הוא שימוש במודל המכיל גם את בסיסי הנתונים וגם את המתודות הדרושות לטיפול בהם ביחידה אחת - class. ביחידה זו מוגדרים באופן ברור המתודות, בסיס הנתונים, הממשקים, וההרשאות הדרושים לצורך מימוש של נושא מסויים. לדוגמא: class בשם rect, שתפקידו לתאר מלבן.
מה יכלול class כזה?
-הוא יכיל data class members עם משתנים שייצגו את אורך הצלעות a ו-b.
-הוא יכיל method class members שיוכלו לבצע פעולות הקשורות למלבן כגון: חישוב שטח, עדכון אורכי הצלעות, שליחה ל-output של השטח ושל אורכי הצלעות.
אז הנה דוגמא לקוד עם class. ה-class מתאר מלבן, ויש לו class members: נתונים ומתודות.
אילו נתונים? a ו-b המתארים את צלעות המלבן.
אילו מתודות? set להכנסת\עידכון ערכי צלעות המלבן, show להצגת ערכי הצלעות והשטח.
הקוד ממומש ב-3 קבצים:
rect.h מכיל את הגדרות ה-class.
rect.cpp מממש את המתודות של ה-class. (אין חובה לשהשתמש בשם זהה לזה של ה-header file אך מומלץ למען הסדר הטוב.)
my_rect.cpp מכיל את main, שם נוצר ומופעל האובייקט של ה-class.
הקובץ מכיל מימוש של שתי המתודות של ה-set ו-show.
שימו לב לשורות 13 ו-17: שם המתודות מצורף תמיד אל שם ה-class א עם :: מפרידות כלומר
Rect:set ו-Rect::show.
שורות 14-15: המתודה set מכניסה ערכים למשתנים a ו-b.
שורות 18-19: המתודה show מציגה את ערכי הצלעות ואת שטח המלבן. לצורך הדפסה משתמשים המתודה cout השייכת לstd class. פוסט הדן ב i/o מתוכנן להמשך.
בכל אופן, חזרתי פעמיים על פקודת ההדפסה - שורות 18 ו-19. ההבדל בין שורות אלה הוא השמטת std:: בשורה 19. מדוע std:: דרוש? כדי לשייך את המתודה (cout למשל) ל-class המתאים. מדוע ויתרנו על הקידומת std:: בשורה 19? בזכות שורה 12 - using namespace std;. עפ"י פקודה זו התוכנה תדע לגשת לספריית std ולמצוא את האובייקט.
בנוסף, שורה 10, חיונית לצורך שימוש בספריית ה-io. שימו לב: זה לא iostream.h, אל רק iostream.
ניגש לקובץ השלישי הממש את ה-main:
שורה 10 יוצרת אובייקט בשם rect מסוג Rect. בפרק על ה-constructor נסביר שמופעל כאן default constructor.
שורה 11 מפעילה את מתודה set ומכניסה את הערכים 2 ו-3 ל-a ול-b בהתאמה.
שורה 13 מפעילה את המתודה show, שמדפיסה את ערכי הצלעות והשטח.
הנה הפלט שמודפס:
edge a = 2
edge b = 3
area = 6
edge a = 2
edge b = 3
area = 6
מה יכלול class כזה?
-הוא יכיל data class members עם משתנים שייצגו את אורך הצלעות a ו-b.
-הוא יכיל method class members שיוכלו לבצע פעולות הקשורות למלבן כגון: חישוב שטח, עדכון אורכי הצלעות, שליחה ל-output של השטח ושל אורכי הצלעות.
אז הנה דוגמא לקוד עם class. ה-class מתאר מלבן, ויש לו class members: נתונים ומתודות.
אילו נתונים? a ו-b המתארים את צלעות המלבן.
אילו מתודות? set להכנסת\עידכון ערכי צלעות המלבן, show להצגת ערכי הצלעות והשטח.
הקוד ממומש ב-3 קבצים:
rect.h מכיל את הגדרות ה-class.
rect.cpp מממש את המתודות של ה-class. (אין חובה לשהשתמש בשם זהה לזה של ה-header file אך מומלץ למען הסדר הטוב.)
my_rect.cpp מכיל את main, שם נוצר ומופעל האובייקט של ה-class.
rect.h
- /*
- * rect.h
- *
- * Created on: Mar 12, 2012
- * Author: ronen
- */
- #ifndef RECT_H_
- #define RECT_H_
- class Rect{
- private:
- int a;
- int b;
- public:
- void set(int a, int b);
- void show();
- };
- #endif /* RECT_H_ */
כאן מוגדר ה-class.
שורה 10: שם ה-class. לפי הקונבנציה המקובלת, שם ה-class מתחיל באות גדולה.
שורה 11 - private. כל ההכרזות מכאן ועד להכרזה אחרת הם private, כלומר לא ניתן לגשת אליהם אלא מתוך האובייקט. אגב, ברירת המחדל לגבי חברי ה-class הוא private, כך שלמעשה לא חובה להוסיף את המציין private כאן.
שורות 12 ו-13: שני משתנים המגדירים את צלעות המלבן. היות שהם private, רק המתודות של האובייקט יוכלו לגשת למשתנים אלה, לצורך כתיבה או קריאה.
שורה 14: public. חברי ה-class מנקודה זו ואילך ניתנים לגישה גם מבחוץ. במקרה שלנו מדובר על שתי מתודות.
שורה 15: מתודת set, להכנסת ערכי צלעות המלבן.
שורה 16: מתודת show להצגת ערכי הצלעות ושטח המלבן.
- rect.cpp
- /*
- * rect.cpp
- *
- * Created on: Mar 12, 2012
- * Author: ronen
- */
- #include <iostream>
- #include "rect.h"
- using namespace std;
- void Rect::set(int edge_a, int edge_b){
- a = edge_a;
- b = edge_b;
- }
- void Rect::show(){
- std::cout << "edge a = " << a << "\nedge b = " << b << "\narea = " << a*b << std::endl;
- cout << "edge a = " << a << "\nedge b = " << b << "\narea = " << a*b << endl;
- }
הקובץ מכיל מימוש של שתי המתודות של ה-set ו-show.
שימו לב לשורות 13 ו-17: שם המתודות מצורף תמיד אל שם ה-class א עם :: מפרידות כלומר
Rect:set ו-Rect::show.
שורות 14-15: המתודה set מכניסה ערכים למשתנים a ו-b.
שורות 18-19: המתודה show מציגה את ערכי הצלעות ואת שטח המלבן. לצורך הדפסה משתמשים המתודה cout השייכת לstd class. פוסט הדן ב i/o מתוכנן להמשך.
בכל אופן, חזרתי פעמיים על פקודת ההדפסה - שורות 18 ו-19. ההבדל בין שורות אלה הוא השמטת std:: בשורה 19. מדוע std:: דרוש? כדי לשייך את המתודה (cout למשל) ל-class המתאים. מדוע ויתרנו על הקידומת std:: בשורה 19? בזכות שורה 12 - using namespace std;. עפ"י פקודה זו התוכנה תדע לגשת לספריית std ולמצוא את האובייקט.
בנוסף, שורה 10, חיונית לצורך שימוש בספריית ה-io. שימו לב: זה לא iostream.h, אל רק iostream.
ניגש לקובץ השלישי הממש את ה-main:
- /*
- * my_rect.cpp
- *
- * Created on: Mar 12, 2012
- * Author: ronen
- */
- #include "rect.h"
- int main(){
- Rect rect;
- rect.set(2,3);
- rect.show();
- return 0;
- }
שורה 10 יוצרת אובייקט בשם rect מסוג Rect. בפרק על ה-constructor נסביר שמופעל כאן default constructor.
שורה 11 מפעילה את מתודה set ומכניסה את הערכים 2 ו-3 ל-a ול-b בהתאמה.
שורה 13 מפעילה את המתודה show, שמדפיסה את ערכי הצלעות והשטח.
הנה הפלט שמודפס:
edge b = 3
area = 6
edge a = 2
edge b = 3
area = 6
קישור להורדת קבצי המקור:
אין תגובות:
הוסף רשומת תגובה