יום שני

Classes

נתקלתי לראשונה ב- ++C וב- Object Oriented Programming, במסגרת קורס. אני זוכר  בעיקר את שתי המנטרות עליהם חזר המרצה כל הזמן: 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.

rect.h 

  1. /*
  2.  * rect.h
  3.  *
  4.  *  Created on: Mar 12, 2012
  5.  *      Author: ronen
  6.  */

  7. #ifndef RECT_H_
  8. #define RECT_H_
  9. class Rect{
  10. private:
  11. int a;
  12. int b;
  13. public:
  14. void set(int a, int b);
  15. void show();
  16. };

  17. #endif /* RECT_H_ */


כאן מוגדר ה-class.
שורה 10: שם ה-class. לפי הקונבנציה המקובלת, שם ה-class מתחיל באות גדולה. 
שורה 11 - private.  כל ההכרזות מכאן ועד להכרזה אחרת הם private, כלומר לא ניתן לגשת אליהם אלא מתוך האובייקט. אגב, ברירת המחדל לגבי חברי ה-class הוא private, כך שלמעשה לא חובה להוסיף את המציין private כאן.
שורות 12 ו-13: שני משתנים המגדירים את צלעות המלבן. היות שהם private, רק המתודות של האובייקט יוכלו לגשת למשתנים אלה, לצורך כתיבה או קריאה.
שורה 14: public. חברי ה-class מנקודה זו ואילך ניתנים לגישה גם מבחוץ. במקרה שלנו מדובר על שתי מתודות.
שורה 15: מתודת set, להכנסת ערכי צלעות המלבן.
שורה 16: מתודת show להצגת ערכי הצלעות ושטח המלבן.

  1. rect.cpp

  2. /*
  3.  * rect.cpp
  4.  *
  5.  *  Created on: Mar 12, 2012
  6.  *      Author: ronen
  7.  */
  8. #include <iostream>
  9. #include "rect.h"
  10. using namespace std;
  11. void Rect::set(int edge_a, int edge_b){
  12. a = edge_a;
  13. b = edge_b;
  14. }
  15. void  Rect::show(){
  16. std::cout << "edge a = " << a << "\nedge b = " << b  << "\narea = " << a*b << std::endl;
  17. cout << "edge a = " << a << "\nedge b = " << b  << "\narea = " << a*b << endl;

  18. }




הקובץ מכיל מימוש של שתי המתודות של ה-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:




  1. /*
  2.  * my_rect.cpp
  3.  *
  4.  *  Created on: Mar 12, 2012
  5.  *      Author: ronen
  6.  */
  7. #include "rect.h"
  8. int main(){

  9. Rect rect;
  10. rect.set(2,3);
  11. rect.show();
  12. return 0;
  13. }

שורה 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


קישור להורדת קבצי המקור:







אין תגובות:

הוסף רשומת תגובה