Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149

Как делать правильнее?

15.03.2012, 16:31. Показов 1182. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс, допустим, "Фигура"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Shape
{
protected:
   int xpos;
   int ypos;
public:
   /* Здесь деструкторы и конструторы, гетеры..., возможно,
 перегруженные операторы и еще много разного на любой вкус - не важно, наверное(?)*/
   void setX(const int newx);
   void setY(const int newy);
   void moveTo(const int, const int);
};
void Shape::SetX(const int newx)
{
   xpos = newx;
}
void Shape::SetY(const int newy)
{
   ypos = newy;
}
Как было бы правильнее сделать?

Так?

C++
1
2
3
4
5
void Shape::moveTo(const int newx, const int newy)
{
   xpos = newx;
   ypos = newy;
}
Или так?

C++
1
2
3
4
5
void Shape::moveTo(const int newx, const int newy)
{
   setX(newx);
   setY(newy);
}
Во втором варианте можно бы было написать?
C++
1
void moveTo(const int, const int) const;
А не
C++
1
void moveTo(const int, const int);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.03.2012, 16:31
Ответы с готовыми решениями:

Перерисовка, как правильнее?
какое условие правильнее использовать если нужно перерисовывать визуализацию, если перетащить другое окно над визуализацией, то...

Как правильнее написать
Пример int ПРОВЕРКА1{ Проверка переменной на свойство; Возврат 1 или 0; } void main(){ int x; ...

Как правильнее сделать?
Как правильно сделать: сначала создать интерфейс программы(формы , фреймы , кнопки и т. д.) или написать программный код?!

16
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 16:32
Цитата Сообщение от Merovingian Посмотреть сообщение
Так?
Первый вариант лучше по времени.
1
31 / 31 / 6
Регистрация: 15.12.2011
Сообщений: 108
15.03.2012, 16:34
второй вариант лучше для поиска ошибок
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
15.03.2012, 16:42
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:42  [ТС]
То, что первый вариант лучше по времени, а второй лучше для поиска ошибок - это я вижу.

Тут, конечно, сложно ошибиться

А больше разницы никакой?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
15.03.2012, 16:44
Для наглядности кода можете подчеркнуть принадлежность изменяемых данных
к классу добавлением указателя this:
C++
1
2
this->xpos = newx;
this->ypos = newy;
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:44  [ТС]
Цитата Сообщение от zss2 Посмотреть сообщение
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
Точно! Сомнения рассеяны... или развеяны)
0
31 / 31 / 6
Регистрация: 15.12.2011
Сообщений: 108
15.03.2012, 16:47
если в классе во многих местах изменяются переменные, то лучше устанавливать их через сетеры. Почему так ? Никто не застрахован он очепяток и нечаянно можно присвоить не той переменной значение. Если писать на прямую то при внушительных обьемах кода можно долго искать где ошибка, а используя сетер поиск ошибки соркатится в разы.
Да и потом возможно гденибудь в драйверах или какихнить скоростных устройствах где доли секунд имеют огромное значение лучше присваивать значение непосредственно переменной, а в обычных программах... ну потеряешь ты сотню тактов... от этого что то изменится ???
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.03.2012, 16:49
Цитата Сообщение от zss2 Посмотреть сообщение
Методы setX(),setY() предназначены для установления значений из кода,
не имеющего доступа к скрытым данным. В обсуждаемом случае метод
moveTo() принадлежит классу и имеет доступ к этим данным,
а, следовательно, вызов setX(),setY является излишним.
В принципе, да. Но если ты собираешься менять формат внутреннего представления, то тебе достаточно будет исправлять геты и сеты, а не отлавливать изменения по всему классу. Так что лучше поинтересуйся, можно ли как то ещё заинлайнить один метод в тело другого, кроме повторения там его исходника. То есть, можно ли написать второй вариант, а получить первый и как это делается.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 16:52  [ТС]
Цитата Сообщение от Melkor Посмотреть сообщение
если в классе во многих местах изменяются переменные, то лучше устанавливать их через сетеры. Почему так ? Никто не застрахован он очепяток и нечаянно можно присвоить не той переменной значение. Если писать на прямую то при внушительных обьемах кода можно долго искать где ошибка, а используя сетер поиск ошибки соркатится в разы.
Да и потом возможно гденибудь в драйверах или какихнить скоростных устройствах где доли секунд имеют огромное значение лучше присваивать значение непосредственно переменной, а в обычных программах... ну потеряешь ты сотню тактов... от этого что то изменится ???

Не по теме:

Ну я не думаю, что сеттеры такие громоздкие бывают, что в них можно заплутать)

А драйверы.... Не думаю, что их пишут на ООП. Почти уверен, что на чистом си

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.03.2012, 17:09
Сеты не могут быть громоздкими, громоздким бывает весь класс, а путаться будешь в общем списке мест их использования. Поэтому и следует поискать, как заставить компилятор подставлять тела методов при каждом использовании в других методах и ни когда не повторять в методах решение задач других методов. Хотя, зависит от сложности формата внутреннего представления, я не знаю, каким оно у тебя может оказаться, а чем он сложнее, тем сложнее и сеты с гетами. Но классы целиком не часто будут в экран влезать.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
15.03.2012, 17:15
Merovingian, делайте через аксессоры, рефакторить будет проще. А по поводу скорости: на таком не экономят. Придет время и если заметятся тормоза, то профайлер в руки. К тому же такие методы можно инлайнить.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 17:20
Цитата Сообщение от fasked Посмотреть сообщение
К тому же такие методы можно инлайнить.
А разве они не по умолчанию инлайн?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.03.2012, 19:33
go, только если описаны в теле класса. Иначе нужно указывать явно.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 19:44
Т. о. подытожу: если функции будут описаны как inline, то второй вариант лучше.
Если же как в этом примере, то первый.
1
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149
15.03.2012, 19:54  [ТС]
Цитата Сообщение от go Посмотреть сообщение
если функции будут описаны как inline, то второй вариант лучше.

Не по теме:

Да, но ведь не факт, что компилятор сделает их inline ?

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.03.2012, 20:10
Merovingian, не факт. Так же не факт, что компилятор не заинлайнит функции, которые таковыми не объявлены.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.03.2012, 20:10
Помогаю со студенческими работами здесь

Как правильнее и быстрее?
Как правильнее будет? Так: SELECT ID, NAME_USR, dbo.GetNameDistr(NAME_USR) AS NAME_DISTR, RIC, RES_VER, CONS_VER, RAM, ...

Как правильнее настроить охлаждение
Здравствуйте! У меня возник вопрос о охлаждении (хотелось бы сбросить температуру видеокарты и жесткого диска) Предусмотрены 2...

Как правильнее обработать исключения?
Здарвствуйте. Хочу сделать так, чтобы кодировка программы задавалась пользователем явно(будь то параметр jvm или параметр приложения) . В...

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

Как правильнее связать сущности?
У меня есть Сущности: СчетЮридическогоЛица ВладыЮридическогоЛица Операции Я их соединил таким образом, но думаю что не правильно,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru