Russian Qt Forum
Ноябрь 23, 2024, 22:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Реализация класса  (Прочитано 7360 раз)
time.h
Гость
« : Июнь 16, 2011, 14:59 »

Нужно написать класс, который содержит несколько одинаковых наборов переменных различных типов.
Как это грамотно реализовать?Правильно ли будет написать для этого набора переменных свой класс?
Записан
Amigo_sa
Гость
« Ответ #1 : Июнь 16, 2011, 15:02 »

Если вы планируете хранить лишь набор переменных без методов, то грамотнее сделать структуру.
Код:

struct STicket
{
   QString name;
   int level;
   qreal difficulty;
   bool isDocumented;
}

************

STicket ticket;
ticket.isDocumented = false;
« Последнее редактирование: Июнь 16, 2011, 15:04 от Amigo_sa » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Июнь 16, 2011, 15:04 »

Amigo_sa: в с++ структура == класс. За исключением private/public.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Amigo_sa
Гость
« Ответ #3 : Июнь 16, 2011, 15:05 »

Я знаю. Просто в структуре нужно писать на одно слово меньше, потому что по умолчанию методы и данные и так public
Записан
time.h
Гость
« Ответ #4 : Июнь 16, 2011, 15:37 »

Учитывая что разница между структурой и классом не велика,что предпочтительнее?
Записан
Amigo_sa
Гость
« Ответ #5 : Июнь 16, 2011, 17:26 »

Есть мнение, что структуры предпочтительнее для "легких" классов (в значении пользовательских типов данных), в которых в основном только данные, а классы - для всех остальных вкусностей ООП. Я считаю, что вам лучше использовать структуры.
Записан
time.h
Гость
« Ответ #6 : Июнь 16, 2011, 20:19 »

Всем спасибо за помощь.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июнь 17, 2011, 06:22 »

>>Есть мнение, что структуры предпочтительнее для "легких" классов
Я несколько раз встречал в книгах известных авторов рекомендацию:
если в структуре нужны методы, то пусть она будет классом. Если методы не нужны - то структура
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 17, 2011, 07:19 »

>>Есть мнение, что структуры предпочтительнее для "легких" классов
Я несколько раз встречал в книгах известных авторов рекомендацию:
если в структуре нужны методы, то пусть она будет классом. Если методы не нужны - то структура
Хмм... ну вот как выглядит Qt класс QPoint  (фрагмент)
Код
C++ (Qt)
class QPoint {
public:
int & rx ()
int & ry ()
void setX ( int x )
void setY ( int y )
int x () const
int y () const
....
private:
int x, y;
};
Прошу пояснить зачем меня нагрузили 6 методами? Делают они что-то полезное или только путаются под ногами в расчетах? Защиты/инкапсуляции x/y все равно никакой, т.к. есть методы возвращающие неконстантные ссылки. Мне кажется в данном конкретном случае struct была бы проще и лучше (несмотря на то что методов здесь может быть много).

По ходу дела вопрос/упражнение для начинающих: а зачем понадобились методы rx() и ry() ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Июнь 17, 2011, 07:31 »

Igors, почитай Александреску "Стандарты программирования на С++", он там объясняет данный подход.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 17, 2011, 08:33 »

Igors, почитай Александреску "Стандарты программирования на С++", он там объясняет данный подход.
Пантер, мне кажется (иногда) надо и своей головой думать, а не только следовать правилам  Улыбающийся
А книга Александреску хорошая
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Июнь 17, 2011, 09:56 »

Igors, в этом классе есть метод возвращающий манхэтенскую длину.
Раз уж метод есть, то класс, а не структура.

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

Юра.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #12 : Июнь 17, 2011, 10:23 »

Зачем используются методы вместо прямого доступа, я теряюсь в догадках.
Для единообразия.
А компилятор скорее всего всё равно (даже без подсказки) их инлайновыми сделает, так что по скорости будет тож на тож.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Июнь 17, 2011, 10:26 »

Зачем используются методы вместо прямого доступа, я теряюсь в догадках.
Чтобы если в дальнейшем потребуется расширение функционала, не потерять совместимости.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
brankovic
Гость
« Ответ #14 : Июнь 17, 2011, 10:42 »

Зачем используются методы вместо прямого доступа, я теряюсь в догадках.
Чтобы если в дальнейшем потребуется расширение функционала, не потерять совместимости.

В одном проекте такой подход к геометрии видел. Шаблонные алгоритмы (построение остова, r-дерево) работали не только с прямоугольниками, но и с любыми объектами имеющими bounding box. При этом обычный прямоугольник тоже снабдили абсурдным на первый взгляд метеодом rect bbox () const {return *this;}. Более гибко получается, любой объект может "притвориться" точкой или прямоугольником безо всякого наследования (типа как в питоне duck typing).
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.367 секунд. Запросов: 23.