Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
#1

Отношения между классами и объектами - C++

15.04.2013, 15:42. Просмотров 3029. Ответов 21
Метки нет (Все метки)

Для каждого индивидуального варианта необходимо создать консольную программу на С++, реализующую отношение ассоциации (агрегации или композиции) между классами и объектами.
Класс «КОМНАТА», содержит закрытые поля: сведения о метраже, высоте потолков и количестве окон и метод подсчета площади комнаты. Класс «КВАРТИРА», содержит закрытые поля: номер этажа, массив объектов класса «КОМНАТА», метод подсчета площади квартиры и метод вывода информации о комнатах квартиры.
За ранее спосибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 15:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отношения между классами и объектами (C++):

OOP (все принципы ООП и основные отношения между классами) - C++
Здравствуйте, помогите пожалуйста. Стоит задача показать все принципы ООП и основные отношения между класами. Сильно не ругайтесь, только...

Задача на тему робота с классами и объектами в С++ - C++
Класс Coins (монеты). Класс сохраняет массив из 3 монет та общее количество лицевых сторон после последнего подбрасывания . Должны быть...

Как работает ссылка с объектами, классами и перегруженным оператором [] - C++
Я тут решил поиграться с кодом и понял что совершенно не догоняю как работает ссылка & Есть код нормально работающий: #include...

Сообщения между объектами - C++
Уважаемые господа! Я недавно начал читать литературу по Smalltalk. Так вот, там коммуникация между объектами происходит через отправку и...

Типы связей между объектами - C++
Какие существуют типы связей между объектами и их смысл? Пыталась гуглить, но ничего конкретного не нашла, чтобы касалось языка с++. Я...

Реализация отношений между объектами - C++
Здравствуйте. Есть задумка организовать класс или что-то в этом роде между объектами в программе, который бы отражал их взаимные...

21
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
15.04.2013, 16:33 #2
C++
1
2
3
4
5
6
7
class Room;
class Flat
  {
  private:
    std::vector<Room*> rooms; //агрегация
    std::vector<Room> rooms; //композиция
  };
п.с. Хотя в отношениях с++ настоящая композиция должна выглядеть так. Потому-что я могу создавать комнаты не на стеке.
C++
1
std::vector<std::auto_ptr<Room*> > rooms;
0
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
15.04.2013, 16:53  [ТС] #3
stima, А как программа начинается например #include <iomanip>,мне на C++ надо написать.Заранее спосибо
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
15.04.2013, 18:42 #4
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <vector>
#include <iostream>
#include <algorithm>
 
class Room
  {
  friend std::ostream& operator<<(std::ostream&, const Room&);
 
  public:
    Room() {}
    Room(int width, int height, int length, int windows = 0)
      : _width(width), _height(height), _length(length), _windows(windows) {}
 
    int width()   const { return _width; }
    int height()  const { return _height; }
    int length()  const { return _length; }
    int windows() const { return _windows; }
 
    int square()  const { return _width * _length; }
 
  private:
    int _width;
    int _height;
    int _length;
    int _windows;
  };
  
class Flat
  {
  friend std::ostream& operator<<(std::ostream&, const Flat&);
 
  public:
    Flat(int level) : _level(level) {}
 
    Room* add_room(Room* room)
      {
      _rooms.push_back(room);
      return _rooms.back();
      }
    
    Room* add_room(int width, int height, int length)
      {
      _rooms.push_back(new Room(width, height, length));
      return _rooms.back();
      }
 
    void remove_room(Room *room)
      {
      std::remove_if(_rooms.begin(), _rooms.end(),
        [&room](Room *it){ return room == it; });
      }
 
    int rooms_count() const { return _rooms.size(); }
 
  private:
    int _level;
    std::vector<Room*> _rooms;
  };
 
std::ostream& operator<<(std::ostream& out, const Room& room)
  {
    return out << "Room's"
               << " width: "  << room.width()
               << " height: " << room.height()
               << " length: " << room.length();
  }
 
std::ostream& operator<<(std::ostream& out, const Flat& flat)
  {
    out << "Flat's level " << flat._level << std::endl;
    out << "Contains rooms: " << std::endl;
 
    std::for_each(flat._rooms.begin(), flat._rooms.end(),
      [&out](Room *it)
        {
        out << *it << std::endl;
        });
 
    return out;
  }
 
int main()
  {
  std::vector<Room*> other_rooms;
  other_rooms.push_back(new Room(10, 10, 10));
 
  Flat flat(2);
  
  Room *room = flat.add_room(new Room(20, 20, 20));
  other_rooms.push_back(room);
 
  flat.add_room(other_rooms[0]);
 
  std::cout << "My new flat is " << flat << std::endl;
  std::cin.get();
 
  return 0;
  }
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.04.2013, 19:00 #5
Цитата Сообщение от stima Посмотреть сообщение
std::vector<std::auto_ptr<Room*> > rooms;
auto_ptr в контейнере - верный способ выстрелить себе в ногу - это раз.
auto_ptr - deprecated - это два.
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
15.04.2013, 19:41 #6
Неумение думать это верный способ выстрелить себе в ногу. Это агрегация, а значит, если с контейнера будет убран объект, то владение теряется! Так, что в этом случае мне все равно на лимитацию STL.

п.с. Хотя сильно спорить не буду. Все зависит от конкретной реализации. Имелось ввиду, что для композиции необязательно создавать обьект на стеке.

Добавлено через 7 минут
п.с.с.
Ошибся). Это композиция и владеть обьектом никто кроме контейнера не должен.
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
15.04.2013, 19:43 #7
auto_ptr в векторе означает, что на каждом изменении размера внутреннего хранилища все объекты, указатели на которые хранились в контейнере, будут уничтожены, а сами указатели станут висячими. При следующем изменении размеров хранилища произойдёт повторное удаление уже удалённых объектов со всеми вытекающими. Вот потому-то auto_ptr и выкинули на мороз.
1
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
15.04.2013, 19:47  [ТС] #8
stima, Три ошибки выдает 50,74,99 строке
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
15.04.2013, 20:37 #9
Это не ошибки, это вы просто не знакомы с новым стандартом. Замените на обычный for(). Как? Подумайте сами.
0
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
21.04.2013, 09:41  [ТС] #10
stima, Я пробывал менять не чего не полуется,не мучай меня.Зделай пожалуйста чтобы работало
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
21.04.2013, 12:57 #11
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <vector>
#include <iostream>
#include <algorithm>
 
class Room
  {
  friend std::ostream& operator<<(std::ostream&, const Room&);
 
  public:
    Room() {}
    Room(int width, int height, int length, int windows = 0)
      : _width(width), _height(height), _length(length), _windows(windows) {}
 
    int width()   const { return _width; }
    int height()  const { return _height; }
    int length()  const { return _length; }
    int windows() const { return _windows; }
 
    int square()  const { return _width * _length; }
 
  private:
    int _width;
    int _height;
    int _length;
    int _windows;
  };
  
class Flat
  {
  friend std::ostream& operator<<(std::ostream&, const Flat&);
 
  public:
    Flat(int level) : _level(level) {}
 
    Room* add_room(Room* room)
      {
      _rooms.push_back(room);
      return _rooms.back();
      }
    
    Room* add_room(int width, int height, int length)
      {
      _rooms.push_back(new Room(width, height, length));
      return _rooms.back();
      }
 
    void remove_room(Room *room)
      {
      _rooms.erase(std::remove(_rooms.begin(), _rooms.end(), room), 
          _rooms.end());
      }
 
    int rooms_count() const { return _rooms.size(); }
 
  private:
    int _level;
    std::vector<Room*> _rooms;
  };
 
std::ostream& operator<<(std::ostream& out, const Room& room)
  {
    return out << "Room's"
               << " width: "  << room.width()
               << " height: " << room.height()
               << " length: " << room.length();
  }
 
std::ostream& operator<<(std::ostream& out, const Flat& flat)
  {
    out << "Flat's level " << flat._level << std::endl;
    out << "Contains rooms: " << std::endl;
 
    std::vector<Room*>::const_iterator cit = flat._rooms.cbegin();
    for ( ; cit != flat._rooms.end(); ++cit)
      out << **cit << std::endl;
 
    return out;
  }
 
int main()
  {
  std::vector<Room*> other_rooms;
  other_rooms.push_back(new Room(10, 10, 10));
 
  Flat flat(2);
  
  Room *room = flat.add_room(new Room(20, 20, 20));
  other_rooms.push_back(room);
 
  flat.add_room(other_rooms[0]);
 
  std::cout << "My new flat is " << flat << std::endl;
  std::cin.get();
 
  return 0;
  }
0
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
21.04.2013, 13:43  [ТС] #12
stima,2 ошибки вылазят 73 и 97 строка.Сейчас покажу какие.
0
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
21.04.2013, 13:44  [ТС] #13
Вот
0
Миниатюры
Отношения между классами и объектами  
shmat_ru
1 / 1 / 0
Регистрация: 23.12.2012
Сообщений: 161
21.04.2013, 13:47  [ТС] #14
stima, Я через MinGW Developer Studio делаю мож в этом проблема
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
21.04.2013, 14:55 #15
странно. попробуйте так
C++
1
2
3
std::vector<Room*>::iterator it = flat._rooms.begin();
for ( ; it != flat._rooms.end(); ++it)
      out << **it << std::endl;
а 2 это варнинг, добавьте перенос строки в конец файла.

п.с. А какой там версии gcc?
0
21.04.2013, 14:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 14:55
Привет! Вот еще темы с ответами:

Сравнение между объектами разных классов - C++
Всем привет, Есть 4 разных класса, в мэине мне нужно их сравнить. Например: A a; B b; if(a==b) dosomething();Можно ли...

Связь между 2 классами - C++
Есть 2 класса: Class A { private: B** arrayB;/нужно раньше объявить класс И ... }; A* Object

Взаимодействие между классами - C++
Суть проблемы такова: в одном файле classy.h объявлено несколько классов (classcontrol, class1, class2,class3). Необходимо сделать так,...

Взаимодействие между классами - C++
При попытке создать указатель на объект класса в public секции другого класса из которого будет обращение к его методу... Cook *cok ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru