Quidnam
Newbie | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Здравствуйте товарищи. Занимался изучением абстрактных классов и натолкнулся на такой вопрос. Как из текущего объекта - Base* myClass = new SubClass(); Создать новый объект, типа SubClass* = new SubSubClass(); При этом перенести все данные полученные в конструкторе Base и SubClass. Звучит наверное странно, Вы наверное скажите передайте по ссылке объект и всё тут. Но возникают много трудностей. Предлагаю следующий код: (Внизу в функции main закоментированно описана проблема подробней) Код: #include <iostream> #include <string> #include <conio.h> using namespace std; class Food { public: Food() { cout << "What is the name of this food? - "; cin >> mName; cout << "How many calories in this food? - "; cin >> mCals; cout << "What is the shape of this food? - "; cin >> mShape; } virtual void Info() const = 0; virtual bool Check() const = 0; int mCals; string mShape; string mName; }; class Member : public Food { public: Member() { cout << "What colour is it? - "; cin >> mColour; } virtual void Info() const { cout << "\n" << mName << " has " << mCals << " it is a " << mColour << " " << mShape; } virtual bool Check() const { if(mName == "Apple") { return true; } return false; } string mColour; }; class NotMember : public Member { public: NotMember() { cout << "How much does it weight? - "; _flushall(); getline( cin, mHeavy, '\n' ); } virtual void Info() const { cout << "\n" << mName << " has " << mCals << " calories" << ", it is a " << mColour << " " << mShape << "\nIt weights " << mHeavy << ", and its not a fruit!"; } protected: string mHeavy; }; class NotMember2 : public NotMember { public: NotMember2() { cout << "Is it an Expensive fruit? (y/n)"; if (_getch() == 'y') { mExpensive = "true"; } else { mExpensive = "false"; } } virtual void Info() const { cout << "\n" << mName << " has " << mCals << " calories" << ", it is a " << mColour << " " << mShape << "." << "\nIt weights " << mHeavy << ", and its not a fruit!\n" << "It is " << mExpensive << " that this food is expensive."; } protected: string mExpensive; }; class FruitMember : public Member { public: FruitMember() { cout << "Is it a tropical fruit? (y/n)"; if (_getch() == 'y') { mTropical = "true"; } else { mTropical = "false"; } } virtual void Info() const { cout << "\n" << mName << " has " << mCals << " calories" << ", it is a " << mColour << " " << mShape << ". It is " << mTropical << " that this fruit is tropical."; } protected: string mTropical; }; class FruitMember2 : public FruitMember { public: FruitMember2() { cout << "\nIs it a European fruit? (y/n)"; if (_getch() == 'y') { mEuropean = "true"; } else { mEuropean = "false"; } } virtual void Info() const { cout << "\n" << mName << " has " << mCals << " calories" << ", it is a " << mColour << " " << mShape << ".\n It is " << mTropical << " that this fruit is tropical.\n" << "It is " << mEuropean << " that this fruit is European."; } protected: string mEuropean; }; int main() { Food* myFood; myFood = new Member; if (myFood->Check()) //Проверяет если введенное название фрукта - Apple { //Здесь должен быть код, который создаст объект FruitMember2, //при этом вызовет конструктор FruitMember и при этом же //сохранит все данные которые были введены в конструкторах //вызванных с помощью myFood = new Member; //Если сюда поместить Food* myFruit = new FruitMember2; //То вызовутся все конструкторы, включая тех, которые были //вызваны с помощью myFood = new Member; //Если сюда поместить MyFruitMember* myFruit = new FruitMember2 //то не будут инициализированны прошлые данные из myFood //Если в конструктор передать по ссылке - //myFruit = new FruitMember2(myFood), то возникнет множество //не приятных проблем... } else { //Здесь то же самое, что выше описано, но для объекта NotMember2 } return 0; }; | Другими словами, задача заключалась в том, чтобы при определенных данных введенных в конструкторе Member, создавался объект Food* myFruit = new FruitMember2; Но в этом объекте должны присутствовать данные уже введенные в конструкторе Member (Иначе их придётся заново вводить). | Всего записей: 3 | Зарегистр. 23-10-2009 | Отправлено: 21:08 26-10-2009 | Исправлено: Quidnam, 21:15 26-10-2009 |
|