Автор Тема: Классы или принцип ООП  (Прочитано 7366 раз)

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 102
  • Репутация: +9/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Классы или принцип ООП
« : Май 15, 2015, 06:27:08 pm »
Всем привет. Господа, кто достаточно хорошо знает С++, объясните поподробнее применение классов на каком-нибудь несложном примере. Спасибо!

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #1 : Май 15, 2015, 07:55:41 pm »
Кстати по работе с классами на сайте нет уроков, а хотелось бы.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #2 : Май 15, 2015, 09:43:31 pm »
Цитировать
Кстати по работе с классами на сайте нет уроков, а хотелось бы.
Наверное, это имелось введу, про то как переписывать классы GTA и затем использовать их в своих плагинах?


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

Например в GTA Vice City. Существует класс CPed - это основная начинка для последующих типов, актеров, которая содержит все в себе важные параметры, как хелсы, координаты, углы, флаги поведения и много всего другого.

От CPed наследуются уже рабочие классы, такие как CCopPed, CEmergencyPed, CCivilianPed, CPlayerPed.

Происходит то, что наследники забирают все поля  с CPed а также добавляют и свои нужные поля.

Таким образом получается, что грубо говоря выделили например актера (CCopPed) - задали поведение, выделили другого (CCopPed) задали совсем другое поведение. Впечатление будет такое, что каждый объект ведет себя по разному и у каждого свои свойства.

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 102
  • Репутация: +9/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #3 : Май 17, 2015, 10:01:29 pm »
Цитировать
Кстати по работе с классами на сайте нет уроков, а хотелось бы.
Наверное, это имелось введу, про то как переписывать классы GTA и затем использовать их в своих плагинах?


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

Например в GTA Vice City. Существует класс CPed - это основная начинка для последующих типов, актеров, которая содержит все в себе важные параметры, как хелсы, координаты, углы, флаги поведения и много всего другого.

От CPed наследуются уже рабочие классы, такие как CCopPed, CEmergencyPed, CCivilianPed, CPlayerPed.

Происходит то, что наследники забирают все поля  с CPed а также добавляют и свои нужные поля.

Таким образом получается, что грубо говоря выделили например актера (CCopPed) - задали поведение, выделили другого (CCopPed) задали совсем другое поведение. Впечатление будет такое, что каждый объект ведет себя по разному и у каждого свои свойства.
Нет, в случае со структурой GTA мне понятно. Я не понимаю лишь сам принцип использования классов в программировании в целом. Хотя, после того как ты ещё раз описал структуру GTA, что-то в моей голове прояснилось. Спасибо :)

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #4 : Май 17, 2015, 10:36:24 pm »
Цитировать
структуру и класс
Одинаковые вещи, принцип тот же.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #5 : Май 18, 2015, 05:37:54 am »
Цитировать
структуру и класс
Одинаковые вещи, принцип тот же.

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

Вот еще пример, хочешь ты создать объект в игре, без класса тебе надо создать функции CreatePed, WeaponCreate, Create_Car, и еще 100 таких же разношерстных функций, но если есть классы, можно прописать в каждом свой метод Create и все станет аккуратно и красиво.
« Последнее редактирование: Май 18, 2015, 06:09:40 am от xanser »

Оффлайн graveman

  • Прохожий
  • *
  • Сообщений: 50
  • Репутация: +3/-0
  • Its cool! Man
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #6 : Июнь 24, 2015, 12:39:17 pm »
Классы - это данные + функции. Можно задавать уровень доступа к ним. Также можно расширять класс (наследование), добавляя новые данные и методы. Почитай Стефана Девиса C++ для чайника - хорошее введение.

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 102
  • Репутация: +9/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #7 : Июнь 24, 2015, 05:27:58 pm »
Классы - это данные + функции. Можно задавать уровень доступа к ним. Также можно расширять класс (наследование), добавляя новые данные и методы. Почитай Стефана Девиса C++ для чайника - хорошее введение.
Я прекрасно знаю, что такое классы. Мне интересно, как они могут применяться на практике

Оффлайн graveman

  • Прохожий
  • *
  • Сообщений: 50
  • Репутация: +3/-0
  • Its cool! Man
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #8 : Июнь 25, 2015, 08:32:51 am »
Я прекрасно знаю, что такое классы. Мне интересно, как они могут применяться на практике
Тогда надо смотреть в сторону паттернов, наверное

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Классы или принцип ООП
« Ответ #9 : Май 31, 2019, 12:38:22 pm »
Напишу пожалуй здесь. Вопрос касается структуры (класса) CompressedVector. Во всех базах:
Код: C++
  1. struct CompressedVector
  2. {
  3.   __int16 x;
  4.   __int16 y;
  5.   __int16 z;
  6. };

И только (теперь и в моей базе для 1.0 так) в базе для GTA3 1.1, которую скинули на форуме SB: https://sannybuilder.com/forums/viewtopic.php?pid=27306#p27306

Код: C++
  1. struct CompressedVector
  2. {
  3.   CVector m_vecPoint;
  4. };

Разбирал функции для GTA3, где используется CompressedVector и получается правильный вариант второй.

Например часть псевдокода функции CCollision::ProcessVerticalLineTriangle при первом варианте:
Код: C++
  1. v7 = &verts[2 * tri->m_nVertA];
  2. v33 = *(float *)&v7->x;
  3. v34 = *(float *)&v7->z;
  4. v35 = *(float *)&v7[1].y;
  5. v8 = &verts[2 * tri->m_nVertB];
  6. v36 = *(float *)&v8->x;
  7. v37 = *(float *)&v8->z;
  8. v38 = *(float *)&v8[1].y;
  9. v9 = &verts[2 * tri->m_nVertC];
  10. v39 = *(float *)&v9->x;
  11. v40 = *(float *)&v9->z;
  12. v41 = *(float *)&v9[1].y;
  13. v10 = *(float *)&colLine->m_vStart.x;

Явно что-то не то...
 
И эта же часть этой же функции при втором варианте:
Код: C++
  1. v7 = &verts[tri->m_nVertA];
  2. v32 = v7->m_vecPoint.x;
  3. v33 = v7->m_vecPoint.y;
  4. v34 = v7->m_vecPoint.z;
  5. v8 = &verts[tri->m_nVertB];
  6. v35 = v8->m_vecPoint.x;
  7. v36 = v8->m_vecPoint.y;
  8. v37 = v8->m_vecPoint.z;
  9. v9 = &verts[tri->m_nVertC];
  10. v38 = v9->m_vecPoint.x;
  11. v39 = v9->m_vecPoint.y;
  12. v40 = v9->m_vecPoint.z;
  13. v10 = colLine->m_vStart.x;

И в других функциях, где используется CompressedVector, такая же ситуация.

Кто-нибудь ещё разбирал этот вопрос? Что скажите?