Няколко въпроси относно условието на домашно 4
Здравейте всички!
Малко ми са неясни някои моменти около домашно номер 4.
1. как по-точно де се реализират подточки 1.а.v и 1.a.vi? Предишните подточки е зададено като се натиска конкретен клавиш. За тези не е казано точно как. Може ли да се реализират и те с натискането на клавиш? Сега го препрочетам отново условието и се чудя - може би това не е точно реализацията на меню, което да извежда възможните опции, а е стъпков процес - първо момичето на касата въвежда 10 цифрения код, след това въвежда една от въпросните букви и чак след това се изпълняват подточки 1.a.v и 1.a.vi
2. от къде се взимат стойности за въпросните items? Според мен би трябвало да има възможност потребителя да може да ги въвежда или ние можем да ги въведем hard-coded?
3. На първо четене, зададената домашна не я виждам като някакво по-сложно използване на знанията, предадени в лекция 4. Имаме масив от един обекти от един несложен клас, където се съхраняват данните на стоките и единствено това го виждам като OOP изпълнение. Никъде не виждам нито онаследяване, множествено онаследяване, да не говорим вече за виртуални функции, абстрактни класове и т.н. Може би само предефинирането на оператор, но и то ми изглежда излишно. Може би отново не съм доразбрал условието?
И аз бих искала да вмъкна един въпрос относно лекция 4. Последния пример, който правихме с класа BankAccount, Man, Women, Person не ми се компилира. Унаследявам с private класа Person от класовете Man и Women и добавям класа Woman като friend клас на класа Man, при предефинирането на оператора равно в класа Women ми дава следната грешка:
'Person::BankAccount' not accessible because 'Man' uses 'private' to inherit from 'Person'
Ето това е кода:
#include <iostream>
class BankAccount
{
public:
float balance;
};
class Person
{
public:
BankAccount BankAccount;
};
class Man;
class Man : private Person
{
public:
Man()
{
BankAccount.balance = 0;
}
friend class Woman;
friend void AddsMoneyToFriendsCard(float amount, Man &aMan);
};
class Women : private Person
{
public:
Women &operator=(Man &aMan)
{
this->BankAccount.balance = aMan.BankAccount.balance;
aMan.BankAccount.balance = 0;
return *this;
}
void wasteMoney()
{
this->BankAccount.balance = 0;
}
};
void AddsMoneyToFriendsCard(float amount, Man &aMan)
{
aMan.BankAccount.balance += amount;
}
int main()
{
Man Gosho = Man();
AddsMoneyToFriendsCard(2000, Gosho);
Women Penka = Women();
Penka = Gosho;
Penka.wasteMoney();
return 0;
}
Благодаря предварително за помощта!
Първо в class Person трябва да е BankAccount bankAccount, макар че, някои компилатори не го правят на проблем. И също трябва да е friend class Women , а не friend class Woman и готовo.
Благодаря за отговора yondim77, толкова пъти го проверих и не забелязах, че не съм написала името на класа точно :)
Само да вметна item = inventoryItems[0] не вика copy constructor, а copy assignment operator. Copy constructor се вика ако имаш item(inventoryItems[0]).
А въпроса ми е, може би към лектора, за точка 1.а.v.: Като се променя цената на стоката, това само в поръчката ли се отразява или и в инвенторито. При втория вариант естествено промяната ще се отрази и при повторно добавяне на стоката.
Мерси.
Мерси, Rsmarinoff, така ще го направя...
Мерси, Rsmarinoff, така ще го направя...
asparuh.k, може и да бъркам, но като си сложа някакъв флаг в copy constructor-а, примерно да ми изписва нещо в конзолата, се вижда, че влиза там при описаната парадигма. Напълно съм сългасен, че не е изрично извикване на copy constructor, но пак си е извикване, според мен.
rsmarinoff май се сещам какво имаш предвид. Ако напишеш:
Item item = inventoryItems[0]
т.е. за пръв път декларираш item, ще се получи инициализация чрез copy-constructor.
Ако напишеш:
Item item;
item = inventoryItems[0]
Тогава ше ти извика copy assignent operator-а (operator=) :)
Естествено за втората схема ще ти трябва dafault constructor за да мине 1-вия ред.
asparuh.k
Точно. Обяснил си го по-добре отколкото вероятно ще мога някога. Даже си редактирах оригиналния пост. :D