Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> классы 
:(
    Опции темы
555shiro
Дата 14.4.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 3.1.2010

Репутация: нет
Всего: нет



здравствуйте!
подскажите пожалуйста где можно найти и изучить самую простенькую программу на "Классы" в качестве примера ?
вообщем чем больше тем лучше! 
поискал в инете ничего путного не нашёл =(
PM MAIL   Вверх
ИванМ
Дата 14.4.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(555shiro @  14.4.2010,  18:25 Найти цитируемый пост)
где можно найти и изучить самую простенькую программу на "Классы" в качестве примера

555shiro, на этом форуме
PM MAIL   Вверх
azesmcar
Дата 14.4.2010, 20:07 (ссылка) |   (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Классы - это наверное самая сложная часть C++ для новичков после указателей. Не потому что сложно понять как они работают, а сложно понять зачем они нужны. Большинство программ с использованием ООП у новичков (да и у не новичков тоже) сводятся к написанию функций в классах. Ну и какой смысл в такой программе? Чем такой способ программирования отличается от процедурного? Ничем! Очень важно понять саму концепцию ООП и тогда использование классов в программе облегчит вашу задачу. Глубокие понимание ООП придет с изучением шаблонов проектирования, но до этого еще есть время. Начнем с простого понятия класс.

Вспомним понятие структуры из языка Си; по сути это объявление нового типа, который состоит из набора объектов определенных типов, например нам нужен тип, хранящих координаты.
Код

struct Point
{
   int x;
   int y;
};

и еще один тип, хранящий информацию о линии. Для линии нам понадобится координаты двух точек, используем уже существующую структуру Point
Код

struct Line
{
   Point start;
   Point end;
};

теперь нам нужна функция, чтобы подсчитать длину этой линии
Код

unsigned int line_length(Line l) {
   return подсчет_длины; // не будем вдаваться в детали реализации
}
...
Line l;
l.start.x = 10;
l.start.y = 10;
l.end.x = 30;
l.end.y = 20;
int length = line_length(l);
...

теперь представим тоже самое в виде класса, т.е. напишем не глобальную функцию а member функцию
Код

struct Line {
private:
   Point start;
   Point end;
public:
    Line(int xf, int yf, int xt, yt) // конструктор {
      start.x = xf;
      start.y = yf;
      end.x = xt;
      end.y = yt;
   }
   unsigned int length() {
      return подсчет_длины;
   }
};

Line l(10, 10, 30, 20);
int length = l.length();

в использовании изменилось не многое, но мы теперь представили нашу линию как самостоятельный объект, который умеет считать свою длину. Можем также создать классы типа Rectangle (прямоугольник), Circle (круг) ... и добавить в них свои функции, например подсчета площади. В таком виде классы не почти не отличаются от структур, хотя на самом деле в C++ класс от структуры отличается одним маленьким нюансом, но об этом потом. 3 главные парадигмы объектно-ориентированного программирования - это
  • Инкапсуляция
  • Наследование
  • Полиморфизм
пройдемся по очереди
Инкапсуляция дает возможность скрывать детали реализации от пользователей вашего класса, предоставляя ему удобный интерфейс для работы с объектом, но скрывая то, что его не касается, например в этом примере
Код

struct Line {
private: // доступ закрыт
   Point start;
   Point end;
...

объекты start и end объявлены как private, это значит, что к этим объектам может обратится только функции самого класса и друзья класса.
public означает, что доступ открыт для всех
protected открывает доступ только для наследников класса и его друзей
например у нас есть функция, которая нужна для внутренней реализации функционала нашего класса и пользователям предоставлять доступ к ней нельзя, в таком случае она объявляется как private, дабы уберечь пользователя от случайных ошибок.

Наследование позволяет расширить функционал класса, не меняя основной, например у нас есть класс TV (телевизор) который работает, имеет функции On(), Off() и ChangeChannel(), но мы хотим создать новый, революционный телевизор под маркой CoolTV, который имеет функцию блокирования каналов, в таком случае мы наследуем уже имеющуюся технологию телевизора, с его функционалом (чтобы не изобретать велосипед) и расширяем его.
Код

class TV {
public:
   void On();
   void Off();
   void ChangeChannel(int channel);
};

class CoolTV : public TV {
public:
   void BlockChannel(int channel);
};

тогда наш класс CoolTV будет обладать всеми функциями класса TV плюс функцией блокирования канала.

Полиморфизм (динамический) позволяет динамически определять функцию, которая должна быть вызвана на основе типа объекта.
Допустим у нас в классе TV есть функция show(), которая отвечает за показ изображения и нам хочется в нашей новой, современной модели изменить эту функцию так, чтобы она показывала цветное изображение.
Код

class TV {
public:
   void On();
   void Off();
   void ChangeChannel(int channel);
   void show();
};

class CoolTV : public TV {
public:
   void BlockChannel(int channel);
   void show(); // переопределяем функцию
};

переопределяем функцию show(), посмотрим что получилось
Код

TV * v = new TV();
v.show(); // вызывается функция show() из класса TV
...
TV * v = new CoolTV();
v.show(); // опять вызывается функция show() из класса TV

если мы вызываем функцию show() через указатель базового класса, вызывается функция из базового, несмотря на то, что на самом деле создан класс CoolTV (т.е. наследник). В чем же проблема? Допустим у нас есть класса RemoteControl, который уже работает с классом TV
Код

class RemoteControl {
public:
   RemoteControl(TV * tvObject); // создаем пульт и настраиваем на работу с нашим телевизором
   void On();
   void Off();
};

при включении нажатии на кнопку включения (т.е. вызове функции On() из класса RemoteControl) вызывается функция On() телевизора и функция show(). В вышеупомянутом примере мы не сможем использовать наш пульт ДУ для класса телевизора CoolTV, потому что несмотря на то, что мы написали функцию вывода цветного изображения эта функция не вызывается. Это очень легко исправить и именно этим и занимается полиморфизм.
Код

class TV {
public:
   void On();
   void Off();
   void ChangeChannel(int channel);
   virtual void show();
};

достаточно добавить ключевое слово virtual перед определением функции в базовом классе, после этого программа начнет вести себя следующим образом
Код

TV * v = new TV();
v.show(); // вызывается функция show() из класса TV
...
TV * v = new CoolTV();
v.show(); // вызывается функция show() из класса CoolTV <--------------!

и тогда нам не придется создавать еще один пульт дистанционного управления для работы с нашим цветным телевизором.

Тема очень большая и все тут написать нереально, вот это то, что не поленился описать, все равно часто спрашивают, буду посылать всех сюда smile 

Может потом еще добавлю, надеюсь нигде не ошибся, много текста а я слишком ленивый, чтобы все проверять еще раз smile 

Это сообщение отредактировал(а) azesmcar - 14.4.2010, 23:40
PM   Вверх
mes
Дата 14.4.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  14.4.2010,  19:07 Найти цитируемый пост)
Чем такой способ программирования отличается от функционального?

судя по контексту, имелся ввиду процедурный стиль,  а за "функциональным" закреплен несколько иной смысл.. 



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 14.4.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(mes @  14.4.2010,  20:48 Найти цитируемый пост)
судя по контексту, имелся ввиду процедурный стиль,  а за "функциональным" закреплен несколько иной смысл.. 

Исправил. smile 
PM   Вверх
mes
Дата 14.4.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  14.4.2010,  19:07 Найти цитируемый пост)
это объявление нового типа, который хранит в себе другие типы,

структура не хранит типы.. 
структура, как объект, состоит из набора объектов  каких-то типов.. ну а как тип, описывает это устройство.



P.S. сорри за придирки,  я из хороших побуждений.. 
P.S.S. на какую статью решился !   smile  правда над ней надо еще хорошо поработать, чтоб можно было отсылать новичков. smile

Это сообщение отредактировал(а) mes - 14.4.2010, 20:59


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 14.4.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(mes @  14.4.2010,  20:54 Найти цитируемый пост)
структура не хранит типы.. 
структура, как объект, состоит из набора объектов  каких-то типов.. ну а как тип, описывает это устройство.

Ну нет опыта написания книг, могу термины попутать smile 

Цитата(mes @  14.4.2010,  20:54 Найти цитируемый пост)
правда над ней надо еще хорошо поработать, чтоб можно было отсылать новичков

дополняйте, исправляйте..я отредактирую, у меня нет претензий на идеал, за пол часика полностью отточить не удастся, иначе быть мне писателем а не программистом smile 

Это сообщение отредактировал(а) azesmcar - 14.4.2010, 21:11
PM   Вверх
kemiisto
  Дата 14.4.2010, 21:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(mes @  14.4.2010,  21:54 Найти цитируемый пост)
правда над ней надо еще хорошо поработать

Я даже могу подсказать в каком направлении работать:
  • Удалить всё, что написано. smile 
  • "Курить" Smalltalk. Увидеть, как оно (ООП) работает в совершенно иной системе. Динамическая типизация, позднее связывание, динамическая диспетчеризация сообщений.
  • "Курить" Oberon-2/Component Pascal (ну можно Fortran, хотя там своих приколов хватает). Увидеть, как оно (ООП) работает в нормальных имеративных языках со строгим контролем типов на этапе компиляции и без всего того хлама, который есть в С++.
  • Осмыслить. Долго и мучительно. smile 
  • Написать всё "с нуля".

Побочные эффекты: уже на стадии осмысления будут весьма и весьма вероятны рефлекторные сокращения ЖКТ даже при беглом взгляде на C++. smile 

Опережая вопрос "Что сам не напишешь?", скажу сразу: я - на стадии осмысления. smile 

P.S. "Ходят слухи", что для полного просветления можно "курнуть" ФП и осознать единство парадигм функционального и объектно-ориентированного программирования.
P.P.S. Ещё можно "курнуть" Lua. Понять, что ООП бывает и без классов. Нужны то всего first-class functions и таблички. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
azesmcar
Дата 14.4.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



kemiisto

Мы тут вроде о C++ говорим.

Добавлено через 1 минуту и 12 секунд
Цитата(kemiisto @  14.4.2010,  21:13 Найти цитируемый пост)
P.P.S. Ещё можно "курнуть" Lua. Понять, что ООП бывает и без классов. Нужны то всего first-class functions и таблички. smile  

и вообще-то вопрос был о КЛАССАХ.
PM   Вверх
kemiisto
Дата 14.4.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(azesmcar @  14.4.2010,  22:14 Найти цитируемый пост)
Мы тут вроде о C++ говорим.

Вижу, вижу.

Цитата(azesmcar @  14.4.2010,  22:14 Найти цитируемый пост)
и вообще-то вопрос был о КЛАССАХ

Да, и вот начало твоего ответа:
Цитата(azesmcar @  14.4.2010,  21:07 Найти цитируемый пост)
Очень важно понять саму концепцию ООП и тогда использование классов в программе облегчит вашу задачу.



--------------------
PM MAIL WWW GTalk Jabber   Вверх
mes
Дата 14.4.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kemiisto @  14.4.2010,  20:13 Найти цитируемый пост)
    * Удалить всё, что написано. smile 
    * "Курить" Smalltalk. Увидеть, как оно (ООП) работает в совершенно иной системе. Динамическая типизация, позднее связывание, динамическая диспетчеризация сообщений.
    * "Курить" Oberon-2/Component Pascal (ну можно Fortran, хотя там своих приколов хватает). Увидеть, как оно (ООП) работает в нормальных имеративных языках со строгим контролем типов на этапе компиляции и без всего того хлама, который есть в С++.
    * Осмыслить. Долго и мучительно. smile 
    * Написать всё "с нуля".


Побочные эффекты: уже на стадии осмысления будут весьма и весьма вероятны рефлекторные сокращения ЖКТ даже при беглом взгляде на C++. smile 

Опережая вопрос "Что сам не напишешь?", скажу сразу: я - на стадии осмысления. smile 

P.S. "Ходят слухи", что для полного просветления можно "курнуть" ФП и осознать единство парадигм функционального и объектно-ориентированного программирования.
P.P.S. Ещё можно "курнуть" Lua. Понять, что ООП бывает и без классов. Нужны то всего first-class functions и таблички. smile 


 smile  и все для того, чтоб объснить новичкам, которые не хотят самостоятельно читать литературу,  как работают классы в C++ smile

P.S.
Цитата(kemiisto @  14.4.2010,  20:13 Найти цитируемый пост)
и осознать единство парадигм функционального и объектно-ориентированного программирования.

слово "единство " имхо не очень подходит на эту роль.. правда другого подходящего вспомнить также не могу smile
smile


Это сообщение отредактировал(а) mes - 14.4.2010, 21:37


--------------------
PM MAIL WWW   Вверх
kemiisto
  Дата 14.4.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(mes @  14.4.2010,  22:33 Найти цитируемый пост)
и все для того, чтоб объснить новичкам, которые не хотят самостоятельно читать литературу,  как работают классы в C++

 smile Есть тут некий оверхед. Но, но, но...

Во-первых, я забыл последний пункт списка:
  • PROFIT???

Во-вторых, ещё раз процитирую:
Цитата(azesmcar @  14.4.2010,  21:07 Найти цитируемый пост)
Очень важно понять саму концепцию ООП

Объясняющему это важно понять в первую очередь.

Ничего личного! smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
ИванМ
Дата 14.4.2010, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Такое ощущение что перед тем, как отправить свой пост, kemiisto курил не только Smalltalk, Oberon-2/Component Pascal, ФП и Lua, а что-то еще smile 


Это сообщение отредактировал(а) ИванМ - 14.4.2010, 21:40
PM MAIL   Вверх
mes
Дата 14.4.2010, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(kemiisto @  14.4.2010,  20:36 Найти цитируемый пост)
PROFIT???

ну это  к обсуждаемому напрямую не относится..

Цитата(kemiisto @  14.4.2010,  20:36 Найти цитируемый пост)
Во-вторых, ещё раз процитирую:

имхо, имелось ввиду :
 Очень важно понять саму концепцию ООП_с_точки_зрения_C++ 
smile
и у автора была поправка на этот счет :
Цитата(azesmcar @  14.4.2010,  20:09 Найти цитируемый пост)
Ну нет опыта написания книг, могу термины попутать smile 

smile

Добавлено @ 21:44
Цитата(ИванМ @  14.4.2010,  20:40 Найти цитируемый пост)
Такое ощущение что перед тем, как отправить свой пост, kemiisto курил не только Smalltalk, Oberon-2/Component Pascal, ФП и Lua, а что-то еще 

Ну тогда придется предположить, что он курит это "что-то" чуть ли не постоянно smile
даже беглый просмотр высказываний "прошлых лет" поможет убедиться в этом..



Это сообщение отредактировал(а) mes - 14.4.2010, 21:54


--------------------
PM MAIL WWW   Вверх
mes
Дата 14.4.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



А вообще он просто за мир во всем мире, и ему обидно, что программисты как художники, используют не радужную палетту с ограниченным набором красок, изготовленную специально для удобства человека,  а неподъемный набор красок и кисточек на любой вкус.. 
smile


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1180 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.