GTA Builder Форум

Программирование => Общие вопросы C++ => Тема начата: Prographer от Май 15, 2015, 06:27:08 pm

Название: Классы или принцип ООП
Отправлено: Prographer от Май 15, 2015, 06:27:08 pm
Всем привет. Господа, кто достаточно хорошо знает С++, объясните поподробнее применение классов на каком-нибудь несложном примере. Спасибо!
Название: Re: Классы или принцип ООП
Отправлено: xanser от Май 15, 2015, 07:55:41 pm
Кстати по работе с классами на сайте нет уроков, а хотелось бы.
Название: Re: Классы или принцип ООП
Отправлено: Sektor от Май 15, 2015, 09:43:31 pm
Цитировать
Кстати по работе с классами на сайте нет уроков, а хотелось бы.
Наверное, это имелось введу, про то как переписывать классы GTA и затем использовать их в своих плагинах?


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

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

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

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

Таким образом получается, что грубо говоря выделили например актера (CCopPed) - задали поведение, выделили другого (CCopPed) задали совсем другое поведение. Впечатление будет такое, что каждый объект ведет себя по разному и у каждого свои свойства.
Название: Re: Классы или принцип ООП
Отправлено: Prographer от Май 17, 2015, 10:01:29 pm
Цитировать
Кстати по работе с классами на сайте нет уроков, а хотелось бы.
Наверное, это имелось введу, про то как переписывать классы GTA и затем использовать их в своих плагинах?


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

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

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

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

Таким образом получается, что грубо говоря выделили например актера (CCopPed) - задали поведение, выделили другого (CCopPed) задали совсем другое поведение. Впечатление будет такое, что каждый объект ведет себя по разному и у каждого свои свойства.
Нет, в случае со структурой GTA мне понятно. Я не понимаю лишь сам принцип использования классов в программировании в целом. Хотя, после того как ты ещё раз описал структуру GTA, что-то в моей голове прояснилось. Спасибо :)
Название: Re: Классы или принцип ООП
Отправлено: Sektor от Май 17, 2015, 10:36:24 pm
Цитировать
структуру и класс
Одинаковые вещи, принцип тот же.
Название: Re: Классы или принцип ООП
Отправлено: xanser от Май 18, 2015, 05:37:54 am
Цитировать
структуру и класс
Одинаковые вещи, принцип тот же.

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

Вот еще пример, хочешь ты создать объект в игре, без класса тебе надо создать функции CreatePed, WeaponCreate, Create_Car, и еще 100 таких же разношерстных функций, но если есть классы, можно прописать в каждом свой метод Create и все станет аккуратно и красиво.
Название: Re: Классы или принцип ООП
Отправлено: graveman от Июнь 24, 2015, 12:39:17 pm
Классы - это данные + функции. Можно задавать уровень доступа к ним. Также можно расширять класс (наследование), добавляя новые данные и методы. Почитай Стефана Девиса C++ для чайника - хорошее введение.
Название: Re: Классы или принцип ООП
Отправлено: Prographer от Июнь 24, 2015, 05:27:58 pm
Классы - это данные + функции. Можно задавать уровень доступа к ним. Также можно расширять класс (наследование), добавляя новые данные и методы. Почитай Стефана Девиса C++ для чайника - хорошее введение.
Я прекрасно знаю, что такое классы. Мне интересно, как они могут применяться на практике
Название: Re: Классы или принцип ООП
Отправлено: graveman от Июнь 25, 2015, 08:32:51 am
Я прекрасно знаю, что такое классы. Мне интересно, как они могут применяться на практике
Тогда надо смотреть в сторону паттернов, наверное
Название: Re: Классы или принцип ООП
Отправлено: kenking от Май 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 (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, такая же ситуация.

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