פורסם 2011 באפריל 1814 שנים שלום רב, כתבתי אובייקט מסוג BigNumber_t שמכיל את הפרמטר char* data . לאובייקט שלושה בנאים ( ברירת מחדל, שמקבל מחרוזת, העתקה). אני צריך לכתוב בשלב הזה מחלקה BigInt_t שיורשת את המחלקה הנ"ל.BigNumber_t.h#ifndef BIGNUMBER_T#define BIGNUMBER_T#include<iostream>using namespace std;class BigNumber_t{public: BigNumber_t(){data = 0;} BigNumber_t(const char*); BigNumber_t(const BigNumber_t&); ~BigNumber_t(); void Print(){cout<<data<<endl;}protected: char* data;};#endifBigNumber_t.cpp#include"BigNumber_t.h"#include<iostream>using namespace std;BigNumber_t::BigNumber_t(const char* number){ if (number!=0) { data = new char[strlen(number)+1]; strcpy(data,number); } else data = 0;}BigNumber_t::BigNumber_t(const BigNumber_t& bigNum){ data = new char[strlen(bigNum.data)+1]; strcpy(data,bigNum.data);}BigNumber_t::~BigNumber_t(){ delete [] data; data = 0;}BigInt_t.h#ifndef BIGINT_T#define BIGINT_T#include"BigNumber_t.h"#include<iostream>using namespace std;class BigInt_t : public BigNumber_t{};#endifmain.cpp#include"BigNumber_t.h"#include"BigInt_t.h"#include<iostream>using namespace std;int main(){ BigInt_t("123"); return 0;}וזו השגיאה שקופצת error C2440: '<function-style-cast>' : cannot convert from 'const char [4]' to 'BigInt_t'אני כנראה לא הבנתי משהו בנושא הורשה, אשמח אם מישהו יכוון אותי אל הטעות שליתודה
פורסם 2011 באפריל 1814 שנים קונסטרקטורים לא עוברים בירושה. אתה צריך להגדיר את הקונסטרקטור ל-BigInt_t במפורש, שיקרא לקונסטרקטור של האבא.
פורסם 2011 באפריל 1814 שנים ב-++C אין ירושה של בנאים (constructor). אתה צריך לממשם בעצמך.ניתן לקרוא לבנאי המחלקה שירשת ממנה ב-initializer:class Base{public: Base(int x) : m_x( x ) { } ... private: int m_x;};class Derived : public Base{public: Derived(int x) : Base(x) {} ...}
פורסם 2011 באפריל 1814 שנים מחבר תודה רבה, עובדשאלה נוספת אני צריך לכתוב אופרטור+, אבל למשש אותו על ה base class אי אפשר כי זאת מחלקה כללית, אני צריך לממש אותו במחלקה BigInt_t ו BigFlt_t . המימוש של האופרטור קצת שונה בשתי המחלקות היורשות. . השאלה אם כזה דבר הוא חוקי?virtual BigNumber_t& operator+(BigNumber_t&) = 0;או שפשוט להכריז עליו בכל מחלקה יורשת ולממש אותו בקבצי ה cpp שלהן?תודה
פורסם 2011 באפריל 1914 שנים באופן כללי, operator overloading ו-virtual לא תמיד עובדים טוב ביחד.operator+ עובד על ערכים, והסמנטיקה שלו לא ממש מתאימה לקריאות וירטואליות.הדבר הכי בטוח (safe) יהיה לממש אותו בנפרד בכל מחלקה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.