Форум программистов, компьютерный форум CyberForum.ru

Композиция классов. Не могу разобраться - C++

Восстановить пароль Регистрация
 
Pozvalovs
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 3
05.10.2013, 18:56     Композиция классов. Не могу разобраться #1
С сентября начал изучение C++, но с нашими темпами не успеваю всё освоить. Собственно само задание:

Реализовать композицию классов из трёх классов:
Класс Computer, который состоит из полей: как минимум 2 параметра по вашему выбору, цена. Реализовать методы:
Konstruktor
SetComputer (присваивает значения полей)
PrintComputer
GetПоле (для каждого поля)

Класс Monitor, который состоит из полей: как минимум 2 параметра по вашему выбору, цена. Реализовать методы:
Konstruktor
SetMonitor (присваивает значения полей)
PrintMonitor
GetПоле(для каждого поля)

Класс Complect, который состоит из полей: name, computer, monitor. Реализовать методы:
Konstruktor
SetComplect (присваивает значения полей)
GetName
GetPrice (возвращает общую цену)
PrintComplect (включая цену)

Первые 2 класса как-то сделал, а вот создать 3-ий класс, который содержит объекты других классов никак не получается.

computer.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef COMPUTER_H
#define COMPUTER_H
 
class Computer
{
public: 
        Computer();
       void SetComputer(int,int,int);
       void PrintComputer();
       int GetHDD();
       int GetRAM();
       int Getcena();
private:
        int HDD;
        int RAM;
        int cena;
};
 
#endif
computer.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include "computer.h"
using namespace std;
 
Computer::Computer()
{
    HDD=0;
    RAM=0;
    cena=0;
}
    
void Computer::SetComputer(int H,int R,int c)
{
     HDD= (H>=0)? H : 0;
     RAM= (R>=0)? R : 0;
     cena= (c>=0)? c :0 ;
}
 
void Computer::PrintComputer()
{
     cout <<"Razmer zhestkogo diska = "<<HDD<<endl<<
     "Objem operativnoj pamjati = "<<RAM<<endl<<
     "Cena etogo kompjutera = "<<cena<<endl<<endl;
}
 
int Computer::GetHDD()
{ cout <<"HDD = "<<HDD<<endl; }
 
int Computer::GetRAM()
{cout <<"RAM = "<<RAM<<endl;}
 
int Computer::Getcena()
{ cout<<"Cena kompjutera = "<<cena<<endl;}
monitor.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef MONITOR_H
#define MONITOR_H
#include <iostream>
 
class Monitor
{
public:
       Monitor();
       void SetMonitor(int,int,int);
       void PrintMonitor();
       int GetDiag();
       int GetChastota();
       int Getcena();
private:
        int Diag;
        int Chastota ; 
        int cena;
};
 
#endif
monitor.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include "computer.h"
#include "monitor.h"
using namespace std;
 
Monitor::Monitor()
{
  Diag=0;
  Chastota=0;
  cena=0;
}
 
void Monitor::SetMonitor(int d, int ch, int c)
{ Diag = (d>=0)? d : 0;
  Chastota = (ch>=10)? ch : 0;
  cena = (c>=0) ? c : 0;
}
 
void Monitor::PrintMonitor()
{
     cout <<"Diagonalj monitora = "<<Diag<<endl
     <<"Chastota monitora = "<<Chastota<<endl
     <<"Cena etogo monitora = "<<cena<<endl<<endl;
}
 
int Monitor::GetDiag()
{
    cout <<"Diagonalj monitora = "<<Diag<<endl;
}
 
int Monitor::GetChastota()
{
    cout <<"Maksimalnaja chastota monitora = "<<Chastota<<endl;
}
 
int Monitor::Getcena()
{
    cout <<"Cena etogo monitora = "<<cena<<endl;
}
Дальше всё не правильно, но выкладываю то, что писал

complect.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef COMPLECT_H
#define COMPLECT_H
#include <iostream>
#include "computer.h"
#include "monitor.h"
#include <stdlib.h>
#include <stdio.h>
using namespace std;
 
class Complect 
{
public: 
        Complect();
       void SetComplect(int,int,int,int,int,int);
       int GetName();
       int GetPrice();
       void PrintComplect();
private:
        const char *Name;
        Computer comp;
        Monitor mon;
};
#endif
complect.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include "computer.h"
#include "monitor.h"
#include "complect.h"
#include <string>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
 
Complect::Complect()
{
 Name="Komplekt odin";
 comp = Computer();
 mon = Monitor();
}
 
void Complect::SetComplect(int a, int b,int c,int d,int e,int f)
{
 Computer::SetComputer(a,b,c);
 Monitor::SetMonitor(d,e,f);
}
 
void Complect::PrintComplect()
{
cout <<"Nazvanie komplekta = "<<Name<<endl;
//cout <<"Monik = "<<<<endl;
//cout <<"Komp = "<<comp<<endl;
}

Ещё есть Main, в котором я проверял работу методов, это не обязательно и делалось только для проверки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdlib>
#include <iostream>
#include "computer.h"
#include "monitor.h"
#include "complect.h"
using namespace std;
 
 
 
int main()
{
   Computer a, b;
   Monitor c, d;
   Complect k;
   a.SetComputer(10,1,1);
   a.PrintComputer();
   b.SetComputer (5,5,22);
   b.PrintComputer();
   c.SetMonitor(10,15,20);
   c.PrintMonitor();
   d.SetMonitor(5,5,62);
   d.PrintMonitor();
   k.PrintComplect();
   
   system("Pause");
   return 0;
}
Заранее благодарен за любую помощь. Если есть готовые коды подобных заданий - также буду благодарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2013, 19:20     Композиция классов. Не могу разобраться #2
Цитата Сообщение от Pozvalovs Посмотреть сообщение
а вот создать 3-ий класс, который содержит объекты других классов никак не получается.
Что, собственно, не получается? Единственное, в PrintComplect() нужно задействовать методы PrintComputer(), PrintMonitor() и Getcena() (чтобы узнать суммарную цену комплекта) этих классов .
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
05.10.2013, 19:25     Композиция классов. Не могу разобраться #3
А какую ошибку то выбивает?

Коды компьютера и монитора не смотрел, в третьем классе не понравилась реализация конструктора
Попробуй так:

C++
1
2
3
4
Complect::Complect()
    :name("Komplekt odin"), comp(), mon()
{
}
если на запятые ругаться будет, то вместо них точки с запятыми поставь

Аа, ты еще и в SetComplect'e нагородил. Неправильно используешь методы ранее реализованных классов - их нужно вызывать не из класса, а из объекта этого класса, т.е.

C++
1
2
3
4
5
void Complect::SetComplect(int a, int b,int c,int d,int e,int f)
{
 comp.SetComputer(a,b,c);
 mon.SetMonitor(d,e,f);
}
Добавлено через 5 минут
И еще, при создании объекта, поле name нормально инициализируется? Мне кажется, там память сначало нужно выделить через new, например
Pozvalovs
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 3
05.10.2013, 20:48  [ТС]     Композиция классов. Не могу разобраться #4
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Попробуй так:
Код C++
1
2
3
4
5
6
Complect::Complect()
* * :name("Komplekt odin"), comp(), mon()
{
}
Попробовал, не ругается.

Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Аа, ты еще и в SetComplect'e нагородил. Неправильно используешь методы ранее реализованных классов - их нужно вызывать не из класса, а из объекта этого класса, т.е.
Код C++
1
2
3
4
5
6
void Complect::SetComplect(int a, int b,int c,int d,int e,int f)
{
*comp.SetComputer(a,b,c);
*mon.SetMonitor(d,e,f);
}
Спасибо, понял.

По чуть-чуть движусь далее ))

Добавлено через 48 минут
Ещё не очень понимаю, как в PrintComplect() задействовать методы PrintMonitor и PrintComputer. Как не указывай, всё равно ошибка.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
05.10.2013, 20:53     Композиция классов. Не могу разобраться #5
Цитата Сообщение от Pozvalovs Посмотреть сообщение
Ещё не очень понимаю, как в PrintComplect() задействовать методы PrintMonitor и PrintComputer. Как не указывай, всё равно ошибка.
да ладно? Так ошибка?
C++
1
2
comp.PrintComputer();
mon.PrintMonitor();
Покажи как пробовал?
Pozvalovs
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 3
05.10.2013, 21:00  [ТС]     Композиция классов. Не могу разобраться #6
Пол часа времени потрачено, а всё оказалось так глупо

C++
1
2
comp.PrintComputer();
mon.PrintMonitor();
почти так и пробовал, только в начале строки было cout, что и испортило весь результат. Обидно, такую мелочь не заметил.

Всем спасибо
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2013, 21:02     Композиция классов. Не могу разобраться #7
предлагаю переделать в этом направлении:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef COMPLECT_H
#define COMPLECT_H
 
class Monitor;
class Computer;
 
class Complect public: 
        Complect();
       void SetComplect(const char *pName, Computer *pComp, Monitor *pMon);
       int GetName();
       int GetPrice();
       void PrintComplect();
private:
        std::string m_Name;
        Computer *m_pComp;
        Monitor *m_pComp;
};
#endif
в тестовой программе создашь и компутер, и монитор, инициализируешь, и потом ими инициализируешь комплект. в конструкторе не забудь инициализировать указатели нулем, а в деструкторе - удалить эти элементы. ну и вообще сделай все красиво.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
05.10.2013, 21:15     Композиция классов. Не могу разобраться #8
C++
1
2
3
4
private:
        const char *Name;
        BaseComputer* computer;
        BaseMonitor*  monitor;
Применение указателей на базовых классов даст больше гибкости за счет использования наследования в будующем.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
05.10.2013, 21:18     Композиция классов. Не могу разобраться #9
Цитата Сообщение от Avazart Посмотреть сообщение
Применение указателей на базовых классов даст больше гибкости за счет использования наследования в будующем.
придумывать базовый класс, который ничего не содержит? Зачем?
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
05.10.2013, 21:28     Композиция классов. Не могу разобраться #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
придумывать базовый класс, который ничего не содержит? Зачем?
А зачем вообще тогда делать композицию ?

Добавлено через 55 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
который ничего не содержит? Зачем?
Базовый != Абстрактный, но возможно абстрактный даже лучше.

Добавлено через 5 минут
- Что бы потом с легкостью можно было изменить поведение, не перестраивая все классы при этом.

C++
1
2
SomeComputer* someComputer= new SomeComputer; // SomeComputer наследован от BaseСomputer
сomplect.setComputer(someComputer);
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2013, 22:06     Композиция классов. Не могу разобраться #11
[QUOTE=Avazart;5142639]
C++
1
        BaseComputer* computer;
лепить звездочку вот так - плохой стиль. может ввести в заблуждение в некоторых случаях как этот
C++
1
ClassA*    blablabla1, blablabla2;
оно выглядит так, как будто оба элемента - указатели, хотя на самом деле - только первый из них. логичнее записать так:
C++
1
ClassA     *blablabla1, blablabla2;
а еще лучше - так:
C++
1
ClassA     *pBlablabla1, blablabla2;
а так - вообще верх:
C++
1
2
ClassA     *pBlablabla1;
ClassA     blablabla2;
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
05.10.2013, 22:35     Композиция классов. Не могу разобраться #12
Цитата Сообщение от novi4ok Посмотреть сообщение
лепить звездочку вот так - плохой стиль.
Кто сказал?
Просто может не стоит делать так
Цитата Сообщение от novi4ok Посмотреть сообщение
ClassA *pBlablabla1, blablabla2;
И все будет норм.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2013, 23:20     Композиция классов. Не могу разобраться
Еще ссылки по теме:

C++ Иерархия и композиция классов
C++ От структур к классам, композиция классов
Композиция классов и объектов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.10.2013, 23:20     Композиция классов. Не могу разобраться #13
я сказал! (с)
Yandex
Объявления
05.10.2013, 23:20     Композиция классов. Не могу разобраться
Ответ Создать тему
Опции темы

Текущее время: 02:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru