סיכום — מחשבון צורות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 63 מתוך 104.
אתגר
קלבואו נבנה מחשבון צורות שמשלב את כל מה שלמדת על פולימורפיזם. תיצור מחלקת Shape מופשטת ותממש צורות קונקרטיות שמחשבות את השטח וההיקף שלהן, והכול יהיה נגיש דרך ממשק משותף.
תארגן את הקוד שלך בארבעה קבצים:
Shape.h: הגדר מחלקתShapeמופשטת שתשמש כתבנית לכל הצורות. מחלקת הבסיס שלך צריכה לכלול:- איבר מוגן מסוג
std::string nameלזיהוי הצורה - בנאי שמאתחל את השם
- מתודות וירטואליות טהורות
area()ו-perimeter()שמחזירותdouble - מתודת
getName()שמחזירה את שם הצורה - הורס וירטואלי
- איבר מוגן מסוג
Circle.h: ממש מחלקתCircleשיורשת מ-Shape:- איבר פרטי מסוג
double radius - בנאי שמקבל את הרדיוס (הגדר את השם ל-
"Circle") - ממש את
area()באמצעות הנוסחה: 3.14159 * radius * radius - ממש את
perimeter()באמצעות: 2 * 3.14159 * radius
- איבר פרטי מסוג
Rectangle.h: ממש מחלקתRectangleשיורשת מ-Shape:- איברים פרטיים מסוג
double widthו-double height - בנאי שמקבל רוחב וגובה (הגדר את השם ל-
"Rectangle") - ממש את
area()בתור width * height - ממש את
perimeter()בתור 2 * (width + height)
- איברים פרטיים מסוג
main.cpp: קרא ארבעה ערכים (כל אחד בשורה נפרדת):- רדיוס המעגל (double)
- רוחב המלבן (double)
- גובה המלבן (double)
- רדיוס המעגל השני (double)
צור את כל שלוש הצורות באופן דינמי ואחסן אותן במערך של מצביעי
Shape*. עבור על המערך, ולכל צורה הדפס את המידע שלה בפורמט הבא:<name>: Area: <area> Perimeter: <perimeter>הדפס שורה ריקה בין כל צורה. נקה את האובייקטים שהוקצו באופן דינמי כשתסיים.
לדוגמה, עבור הקלטים 5, 4, 6 ו-3:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495שים לב שאותה לוגיקת printShapeInfo פועלת עבור כל סוג של צורה. זהו כוחו של פולימורפיזם. הקוד שלך מעבד מעגלים ומלבנים באופן זהה דרך הממשק Shape, וכל צורה יודעת לחשב את המידות שלה. השתמש במילת המפתח override בכל המתודות שנדרסו כדי להבטיח חתימות פונקציה נכונות.
נסו בעצמכם
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// קראו את הקלטים
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: צרו מערך של מצביעי Shape* עם 3 איברים
// Shape* shapes[3];
// TODO: צרו צורות באופן דינמי ושמרו אותן במערך
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: עברו על המערך והדפיסו את המידע על כל צורה
// פורמט:
// <name>:
// Area: <area>
// Perimeter: <perimeter>
// (שורה ריקה בין הצורות, אך לא אחרי האחרונה)
// TODO: שחררו את האובייקטים שהוקצו דינמית
// delete shapes[i];
return 0;
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין