Loading...
mitko.z avatar mitko.z 5 Точки

Няколко въпроси относно условието на домашно 4

Здравейте всички!

Малко ми са неясни някои моменти около домашно номер 4.

1. как по-точно де се реализират подточки 1.а.v и 1.a.vi? Предишните подточки е зададено като се натиска конкретен клавиш. За тези не е казано точно как. Може ли да се реализират и те с натискането на клавиш? Сега го препрочетам отново условието и се чудя - може би това не е точно реализацията на меню, което да извежда възможните опции, а е стъпков процес - първо момичето на касата въвежда 10 цифрения код, след това въвежда една от въпросните букви и чак след това се изпълняват подточки 1.a.v и 1.a.vi

2. от къде се взимат стойности за въпросните items? Според мен би трябвало да има възможност потребителя да може да ги въвежда или ние можем да ги въведем hard-coded?

3. На първо четене, зададената домашна не я виждам като някакво по-сложно използване на знанията, предадени в лекция 4. Имаме масив от един обекти от един несложен клас, където се съхраняват данните на стоките и единствено това го виждам като OOP изпълнение. Никъде не виждам нито онаследяване, множествено онаследяване, да не говорим вече за виртуални функции, абстрактни класове и т.н. Може би само предефинирането на оператор, но и то ми изглежда излишно. Може би отново не съм доразбрал условието?

Тагове:
4
C++ Programming
dZf1aeA-rsmarinoff avatar dZf1aeA-rsmarinoff 49 Точки
Best Answer

1.

Направи си някакво меню от рода:

1. Use cash register

2. Update item price

3. List last purchase

след което когато някой избере 1, ще си тръгва стандартната функционалност с касата, а другите 2 ще бъдат за точките, за които си писал.

2. Предполагам трябва да са хардкоднати. Ако толкова искаш, можеш да си добавиш и още една опция в менюто, Add item to inventory, която като я избереш и ще се искат данни от потребителя за нова стока и ще се вика конструктора и някой add метод на някой клас, или пък ще я добавяш в някой масив в main файла, зависи какво ползваш. Според мен е прекалено много, обаче и си усложняваш задачата ненужно.

3 и 4. Идеята е да използваш copy constructor-а по някакъв начин. По принцип няма смисъл да се пише copy constructor, ако в класа нямаш някое друго поле, което да е указател, така че го измисли да е по този начин, след което в някакъв момент ще имаш нещо от рода Item item = inventoryItems[0] и ще си изпълнил условието да се вика copy constructor. Дори можеш да си сложиш едно cout << "Copy Constructor Called" << endl; в самия copy constructor, за да видиш кога се вика и как да го използваш точно.

Надявам се да съм помогнал поне малко, по принцип не мога да обяснявам особено добре. :D

4
27/06/2016 15:11:34
lucky_9 avatar lucky_9 14 Точки

И аз бих искала да вмъкна един въпрос относно лекция 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;
}

Благодаря предварително за помощта!

0
yondim77 avatar yondim77 5 Точки

Първо в class Person трябва да е BankAccount  bankAccount, макар че, някои компилатори не го правят на  проблем. И също трябва да е friend class Women , а не friend class Woman и готовo.

1
22/06/2016 12:19:15
lucky_9 avatar lucky_9 14 Точки

Благодаря за отговора yondim77, толкова пъти го проверих и не забелязах, че не съм написала името на класа точно :)

1
asparuh.k avatar asparuh.k 16 Точки

Само да вметна item = inventoryItems[0] не вика copy constructor, а copy assignment operator. Copy constructor се вика ако имаш item(inventoryItems[0]).

А въпроса ми е, може би към лектора, за точка 1.а.v.: Като се променя цената на стоката, това само в поръчката ли се отразява или и в инвенторито. При втория вариант естествено промяната ще се отрази и при повторно добавяне на стоката.

Мерси.

1
mitko.z avatar mitko.z 5 Точки

Мерси, Rsmarinoff, така ще го направя...
 

0
mitko.z avatar mitko.z 5 Точки

Мерси, Rsmarinoff, така ще го направя...
 

0
dZf1aeA-rsmarinoff avatar dZf1aeA-rsmarinoff 49 Точки

asparuh.k, може и да бъркам, но като си сложа някакъв флаг в copy constructor-а, примерно да ми изписва нещо в конзолата, се вижда, че влиза там при описаната парадигма. Напълно съм сългасен, че не е изрично извикване на copy constructor, но пак си е извикване, според мен.

0
asparuh.k avatar asparuh.k 16 Точки

rsmarinoff май се сещам какво имаш предвид. Ако напишеш:

Item item = inventoryItems[0]

т.е. за пръв път декларираш item, ще се получи инициализация чрез copy-constructor.

Ако напишеш:

Item item;
item = inventoryItems[0]

Тогава ше ти извика copy assignent operator-а (operator=) :)

Естествено за втората схема ще ти трябва dafault constructor за да мине 1-вия ред.

1
27/06/2016 10:51:19
dZf1aeA-rsmarinoff avatar dZf1aeA-rsmarinoff 49 Точки

asparuh.k

Точно. Обяснил си го по-добре отколкото вероятно ще мога някога. Даже си редактирах оригиналния пост. :D

0
27/06/2016 15:15:15
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.