В настоящее время вы не используете состав, но копируете атрибуты из двух других классов, и вы выполняете большую работу при вызове конструктора из main
Первое небольшое изменение в вашем коде - получение экземпляров. Компьютер и Монитор в параметре в конструкторе:
Complect(std::string name, const Computer &, const Monitor &);
Конечно, окончательная цена также вычисляется внутри этого конструктора, в main вы просто создаете комплект с его названием и его частями:
Complect numberOne ("Number one complect", asus, iiyama);
Теперь main к счастью, не нужно знать, как рассчитывается цена, иначе представьтеесли формула изменилась, и вам необходимо обновить все вызовы конструктора :-(. Способ расчета цены зависит только от Complect .
Complect numberOne ("Number one complect", asus, iiyama);
Больше, чемКонструктор setComplect необходимо обновить, чтобы получить цену монитора и компьютера, разделенных по той же причине.
void setComplect(std::string name, std::string computername, std::string monitorname, double computerprice, double monitorprice);
или, возможно, лучше заменить его методами
void setname(std::string name);
void setcomputer(std::string computername, double computerprice);
void setmonitor(std::string monitorname, double monitorprice);
Но дублировать все атрибуты Компьютер и Монитор в Комплект нецелесообразно, и у вас нетсостав к экземплярам.Первая возможность - сохранить их копию:
class Complect{
...
private:
Computer computer;
Monitor monitor;
// does not need attribute "double cost_price;"
...
};
Complect::Complect(std::string name, const Computer & c, const Monitor & m)
: complect_name(name), computer(c), monitor(m) {
}
std::string Complect::computername() const{
return computer.name();
}
std::string Complect::monitorname() const{
return monitor.name();
}
double Complect::price() const{
return computer.price() + monitor.price();
}
void Complect::printComplect(){
std::cout << "Complect name = " << name() <<"\n"
<< "Computer name = " << computer.name() <<"\n"
<<"Monitor name = " << monitor.name() <<"\n"
<<"Complect price = " << price() <<" EUR \n";
}
Преимущество этого решения заключается в том, что на вас не влияют первоначальные экземпляры Monitor и Computer исчезают.Недостатком является, например, то, что цена не обновляется, если цена одной из клонированных частей изменяется, за исключением вызова setXXX
Другой способ - не клонировать монитор и компьютер., но вы не можете получить только это:
class Complect{
...
private:
Computer & computer;
Monitor & monitor;
// does not need attribute "double cost_price;"
...
};
Complect::Complect(std::string name, const Computer & c, const Monitor & m)
: complect_name(name), computer(c), monitor(m) {
}
, потому что это предполагает, что экземпляры Monitor и Computer все еще существуют, в то время как соответствующий экземпляр Complect существует
К счастью, C ++ предлагает интересные функции для управления этим