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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Gambit_d.s
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 9
#1

Создание класса "Фильм" - C++

07.01.2012, 19:14. Просмотров 1849. Ответов 26
Метки нет (Все метки)

Помогите, пожалуйста!!!

Нужно сделать следующее:

1.Построить класс
Фильм (со свойствами):
название фильма,
длительность (кол-во мин),
жанр.
Реализовать следующие методы класса:
вернуть жанр фильма,
вернуть длительность фильма,
показать всю информацию о фильме.

Построить двух наследников данного класса.
2.Художественный фильм (со своим атрибутом):
Фамилия режиссёра фильма
методами:
вернуть фамилию режиссера,
показать всю информацию о художественном фильме (произвести замещение данного метода с учетом нового атрибута).
В классе Художественный фильм создать специальный закрытый атрибут (и метод печатающий значение данного атрибута), значение которого отражает количество объектов класса Художественный фильм функционирующих в программе.


3.Класс
Документальный фильм (со своим атрибутом):
возрастная категория.
Выполнить замещение метода печатающие все свойства фильма, с учетом нового атрибута.

Вроде построил класс (для 1 "фильмы"), но не могу понять как действует конструктор и деструктор
и методы класа тоже понял расплывчато.

Помогите хотябы с одним классом, чтобы я понял как это все работае.

p.s. Зарание спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 19:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание класса "Фильм" (C++):

Создание объекта класса сразу после его описания (между "}" и ";") - C++
Пишу проект с дюжиной хедеров и десятком cpp-шников. Мне нужны пара объектов класса А, которые должны существовать на протяжении всей...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Реализация класса "Студент" и наследование от него класса "Аспирант" - C++
Помогите, пожалуйста! Создать абстрактный базовый класс Person, описывающий обычного человека. Создайте производный класс Student,...

Переопределение операторов, создание класса "Матрица" - C++
Здравствуйте, нужна помощь, уже очень долго не могу понять в чём проблема. Создал класс матрица, не работает простой код. Проблема в...

Создание динамических массивов внутри класса: Нарушение прав доступа при чтении "0xbf800000" - C++
столкнулся с непонятной для меня бедой. Если код написать внутри главной функции то всё работает. Но если попытаться перенести работу в...

26
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
07.01.2012, 21:05 #16
Так:
C++
1
2
3
4
class Supervisor: public movie
{
    Supervisor (const char *name...blablabla): movie(name..blablabla) //Короче это пример вызова конструктора movie из класса дочернего Supervisor
};
1
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.01.2012, 21:21 #17
На всякий случай
Чтобы наследники могли "видеть" закрытые элементы родителя, их(элементы) нужно поместить в секцию protected
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
07.01.2012, 21:39 #18
Цитата Сообщение от soon Посмотреть сообщение
Чтобы наследники могли "видеть" закрытые элементы родителя
А зачем им их видеть? Базовый класс оборудован для их управления всем чем нужно(особенно если сделать парочку проверок). Зачем забивать голову этим для незачем?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.01.2012, 21:55 #19
Цитата Сообщение от dimcoder Посмотреть сообщение
А зачем им их видеть?
А зачем тогда наследовать? С тем же успехом можно создать в новом классе экземпляр "базового" и через него работать.
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
08.01.2012, 10:07 #20
Цитата Сообщение от soon Посмотреть сообщение
А зачем тогда наследовать?
Что значит зачем наследовать? Хотите сказать, что если будете использовать protected-наследование, будет лучше? Это нарушение инкапсуляции.
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream.h>
#include <conio.h>
#include <string.h>
 
class movie
{
   public:
 
   movie(const char * = 0, int = 0, const char * = 0);
 
   const char * getName()
   {
      return name;
   }
 
   int getLength()
   {
      return length;
   }
 
   const char * getJanr ()
   {
      return janr;
   }
 
   void setJanr(const char *);
   void setLength(int x) {length = (x > 0) ? x : 0;}
   void setName(const char *);
 
   void print()
   {
      cout << "Name = " << this->getName() << endl;
      cout << "Janre = " << this->getJanr() << endl;
      cout << "Length = " << this->getLength() << endl;
   }
 
   private:
 
   char name[30];
   char janr[30];
   int length;
};
 
movie::movie (const char * _name, int _l, const char * _janr)
{
   setJanr(_janr);
   setName(_name);
   setLength(_l);
}
 
void movie::setJanr(const char *j)
{
   for (int i = 0; i <= strlen(j); i++)
      janr[i] = j[i];
}
 
void movie::setName (const char * n)
{
   for (int i = 0; i <= strlen(n); i++)
      name[i] = n[i];
}
 
 
class ArtFilm: public movie
{
   public:
 
   ArtFilm(const char * _name, int _l, const char * _janr, const char * _supName):
      movie(_name, _l, _janr)
   {
      setSupName(_supName);
   }
 
   void setSupName(const char *);
 
   const char * getSupName() {return supName;}
 
   void print()
   {
      movie::print();
      cout << "Supervisor name is " << getSupName() << endl;
   }
 
   private:
 
   char supName[30];
};
 
 
void ArtFilm::setSupName(const char * _supName)
{
   for (int i = 0; i <= strlen(_supName); i++)
      supName[i] = _supName[i];
}
 
main ()
{
   clrscr();
 
   movie m("Titanik", 300, "Drama");
   ArtFilm n("2012", 180, "Action", "James Cameron");
 
   m.print();
 
   cout << endl;
 
   n.setName("20012");   //Пример доступа к закрытым элементам базового класса
 
   n.print();
 
   getch();
 
   return 0;
}
Цитата Сообщение от soon Посмотреть сообщение
С тем же успехом можно создать в новом классе экземпляр "базового" и через него работать.
Я весь внимания.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 10:27 #21
Цитата Сообщение от dimcoder Посмотреть сообщение
Это нарушение инкапсуляции.
Не смертельно. Непосредственно через объект все равно нет доступа.

Цитата Сообщение от dimcoder Посмотреть сообщение
Я весь внимания.
Создайте 2 класса, в один поместите экземпляр другого. Так сложно? Но так никто не делает, потому что пришось бы 2 раза объявлять одни и те-же функции для доступа к приватным.

А теперь представьте, что вам понадобилось в классе-наследнике изменить приватную переменную базового класса. Что вы предпочтете, объявить ее в protected в базовом, или в производном писать var.setNum(var.getNum() * var.getNum())? А если это не одна переменная?
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
08.01.2012, 10:44 #22
Цитата Сообщение от soon Посмотреть сообщение
понадобилось в классе-наследнике изменить приватную переменную базового класса.
Для этого существует интерфейс класса - функции-элементы. Пример - 20 пост, 107 строка кода. А если надо просто изменить закрытую переменную и не получается через интерфейс, значит вы это не сделаете никак через дочерний класс. Если я ошибаюсь, приведите пример пожалуйста.

Добавлено через 1 минуту
Цитата Сообщение от soon Посмотреть сообщение
Создайте 2 класса, в один поместите экземпляр другого. Так сложно? Но так никто не делает, потому что пришось бы 2 раза объявлять одни и те-же функции для доступа к приватным.
Не могу не согласиться, но раннее вы написали:
Цитата Сообщение от soon Посмотреть сообщение
С тем же успехом можно создать в новом классе экземпляр "базового" и через него работать.
1
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
08.01.2012, 11:04 #23
dimcoder, soon, Простите что вмешиваюсь, вы зачем путаете мухи с котлетами? Включение объектов другого класса в качестве членов класса называется композицией или агрегированием. Это вообще никак нельзя даже сравнивать с наследованием потому что нет ничего общего. has-a relationship не есть is-a relationship
Одно для одних задач другое для других. Все зависит от архитектуры которую требуется создать для решения задачи.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 11:10 #24
Я и не отрицал, что так будет работать. Но почему ArtFilm не может видеть name, janre, length напрямую? Ведь по сути, они принадлежат ему.

Цитата Сообщение от dimcoder Посмотреть сообщение
Если я ошибаюсь, приведите пример пожалуйста.
Не ошибаетесь, доступ к приватным данным есть только у класса.

Цитата Сообщение от soon
С тем же успехом можно создать в новом классе экземпляр "базового" и через него работать.
Я имел в виду, что кроме "копирования" кода ничего не изменится. Мои извинения, если я ввел вас этим в заблуждение.

И да, моя вина, не сказал раньше. Все что было мною сказано относилось в большей степени к данному заданию. Я действительно не вижу смысла использовать в классе-наследнике set/get функции базы(если их вдруг потребуется использовать в самом классе), когда можно просто сделать их protected.
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
08.01.2012, 11:19 #25
Цитата Сообщение от soon Посмотреть сообщение
Я действительно не вижу смысла использовать в классе-наследнике set/get функции базы
Работа через public get и set методы обеспечит вам как минимум:
1 - обеспечить реализацию дочерних классов вне зависимости от возможных изменений базового класса, т.к. public методы для наследников фактически являются интерфейсом. Вы можете изменять родительский класс как угодно и не потребуется ничего менять в наследниках
2 - возможность провести необходимые проверки чтобы наследники не могли сохранить не валидные данные в поля родительского класса.
2
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
08.01.2012, 11:49 #26
Цитата Сообщение от soon Посмотреть сообщение
Но почему ArtFilm не может видеть name, janre, length напрямую?
Если он их видит напрямую, значит он их может изменять. А зачем ему их изменять, если всю работу делает за него базовый класс? + Базовый класс предоставляет функции get, которые прекрасно выполняют свою роль. Я просто не вижу смысла использования protected. Как бы вы описали дочерний класс использую этот метод с protected?
Соглашусь с тем, что может я и зря описал set'ы. Этого не было в задании. Но get'ы были в задании, и я их успешно использовал в дочернем классе.

Добавлено через 13 минут
greeezz, спасибо, то что я и имел ввиду.
1
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.01.2012, 11:50 #27
Цитата Сообщение от dimcoder Посмотреть сообщение
Я просто не вижу смысла использования protected
Да вы правы. К сожалению, я не до конца прочитал задание. Мои извинения.
0
08.01.2012, 11:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 11:50
Привет! Вот еще темы с ответами:

Создание класса "Комплексные числа" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; class Complex { private: double real; double image; public: Complex(double r,...

Создание и использование класса "Аквариум" - C++
Помогите с реализацией . Класс создан , а дальше немного непонятно . Класс Аквариум Скрытые поля: • Номер по порядку (назначается...

Создание класса "точка на плоскости" - C++
Создать класс &quot;точка на плоскости&quot;. Данные класса должны быть представлены 2мя полями: координатами точки. Класс должен содержать...

Добавление в файл и удаление из файла записей о объектах структуры "Фильм" - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; using namespace std ; int const col=4; struct...


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

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

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