Russian Qt Forum

Программирование => С/C++ => Тема начата: Omg от Февраль 03, 2011, 21:13



Название: Структура и типы
Отправлено: Omg от Февраль 03, 2011, 21:13
Код:
typedef struct M_UD{
        int         x;          
        QString     y;    
        QString     z;    
        short       s;      
    }GD;
    QList<GD >* m_list;
Правилен ли подход и как с подобным работать, пока плохо понимаю. %) Может есть что попороще? Задача сохранять в листе разные типы данных при этом они должны быть связаны.
Или лучше пойти по СПП пути и создать отдельный класс? Но тогда я знаю как с ним работать ^^


Название: Re: Структура и типы
Отправлено: Fat-Zer от Февраль 03, 2011, 21:34
прочитайте какую-нибудь книжку по С++, а лучше сначала по си а потом по с++.
теперь по порядку:

> typedef struct M_UD{
тайпдефы в объявление структур нужны были в си

> QList<GD >* m_list;
так можно, если вы понимаете, что написали, но скорей всего вы имели в виду "QList<GD*>"

> Правилен ли подход и как с подобным работать, пока плохо понимаю. %) Может есть что попороще? Задача сохранять в листе разные типы данных при этом они должны быть связаны.
работать:
Код
C++ (Qt)
QList<GD*> m_list;
m_list= new QList<GD>;
m_list->append(new GD);
m_list->last()->x=1;
m_list->last()->y="qwerty";
 

> Или лучше пойти по СПП пути
это две опечатки в ООП?

> Но тогда я знаю как с ним работать
ну так используйте


Название: Re: Структура и типы
Отправлено: Omg от Февраль 03, 2011, 21:58
СПП - CPP - C++ - классы, вместо структур, это я имел в виду. Просто был интересен именно такой подход и как его реализовать. Ведь надо же учиться, не просто так же спрашивать и делать, как знаешь. ;)
Премного благодарен.


Название: Re: Структура и типы
Отправлено: merke от Февраль 04, 2011, 04:31
Код
C++ (Qt)
struct M_UD
       {
          int         x;          
          QString     y;    
          QString     z;    
          short       s;      
       }GD;
 
QList<GD> m_list;
 
m_list[0].x = 1;
m_list[0].y.append("Hi");

и т.д.


Название: Re: Структура и типы
Отправлено: gogi от Февраль 04, 2011, 11:05
СПП - CPP - C++ - классы, вместо структур, это я имел в виду.
С точки зрения компиляторы с++ - это почти одно и тоже.


Название: Re: Структура и типы
Отправлено: Omg от Февраль 04, 2011, 11:12
Я в курсе и что? Видимо вы плохо поняли о чем я говорил...

Александр, спасибо за еще один пример.


Название: Re: Структура и типы
Отправлено: _govorilka от Февраль 04, 2011, 11:38
Ты можешь взять QVariantList. Это готовое решение и при этом довольно развитое.


Название: Re: Структура и типы
Отправлено: Omg от Февраль 04, 2011, 11:58
Спасибо, попробую копнуть в этом направлении. :)


Название: Re: Структура и типы
Отправлено: slim от Февраль 04, 2011, 19:14
Настоятельно рекомендую не использовать открытые поля, лучше перенечи их в секцию private, а доступ к ним сделай через методы:
struct M_UD
        {
           int get_x() const;
           void set_x(int);
         private:
           int         x;   
        }GD;
 
QList<GD> m_list;


Название: Re: Структура и типы
Отправлено: Пантер от Февраль 04, 2011, 19:44
slim, а смысл для обычной структуры так извращаться? В данном случае это излишне.


Название: Re: Структура и типы
Отправлено: Omg от Февраль 04, 2011, 19:48
Тем более она и так приват в любом случае. :)


Название: Re: Структура и типы
Отправлено: slim от Февраль 04, 2011, 19:53
правильно писать смысл есть всегда  ;)


Название: Re: Структура и типы
Отправлено: Пантер от Февраль 04, 2011, 19:57
Omg, кто приват?
slim, Бритва Оккама (http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0)


Название: Re: Структура и типы
Отправлено: Igors от Февраль 04, 2011, 20:11
Настоятельно рекомендую не использовать открытые поля, лучше перенечи их в секцию private, а доступ к ним сделай через методы:
struct M_UD
        {
           int get_x() const;
           void set_x(int);
         private:
           int         x;   
        }GD;
 
QList<GD> m_list;
Прошу меня правильно понять - я не хочу "придраться", начать "холивар" и.т.п. Но мне интересно понять ЗАЧЕМ? Почему "автоматическое" объявление private (многими) считается "всегда лучше"? Я понимаю set_x как намек: этот метод может производить какие-то действия, изменять и др. члены класса, а не просто установить x. Но в изначальной структуре я не вижу никакого даже намека на такую ф-циональность. Что же Вы хотели этим сказать (какую мысль выразить)? 


Название: Re: Структура и типы
Отправлено: Omg от Февраль 04, 2011, 20:15
Omg, кто приват?
slim, Бритва Оккама (http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0)
Структура, просто тут это не описано.


Название: Re: Структура и типы
Отправлено: slim от Февраль 04, 2011, 21:02
2Igors:
моя мысль выражается в том, что данные нужно инкапсулировать.


Название: Re: Структура и типы
Отправлено: Igors от Февраль 04, 2011, 21:54
2Igors:
моя мысль выражается в том, что данные нужно инкапсулировать.
Цель инкапсуляции - скрыть "внутренние делали реализации". Теперь getX/setX вместо "просто x" - ну и что же этим скрывается?  :)

Хоть бы один честно сказал "ну списываю"  :)


Название: Re: Структура и типы
Отправлено: slim от Февраль 04, 2011, 22:29
если данные используются за приделами класса/структуры я их всегда инкапсулирую


Название: Re: Структура и типы
Отправлено: Waryable от Февраль 05, 2011, 08:13
Не знаю как вы, но я использую структуры только для группировки данных, не предъявляющих к своему доступу никаких требований. Все остальное оформляется другим способом. Как раз одним из средств реализации этих требований и является инкапсуляция.

PS: аднака вероятен холивар...  :D


Название: Re: Структура и типы
Отправлено: kuzulis от Февраль 05, 2011, 11:50
Зачем использовать в С++ вообще структуры?
Замените их на классы и всё, ИМХО, месить всё  кучу - нехорошо.


Название: Re: Структура и типы
Отправлено: Omg от Февраль 05, 2011, 12:31
Удобочитаемость программы - не? Не катит?


Название: Re: Структура и типы
Отправлено: Пантер от Февраль 05, 2011, 12:40
kuzulis, иногда хорошо. Для обобщения каких-либо данных. Так же если в
классе становится довольно много mutable членов, то лучше их собрать в одну структуру.


Название: Re: Структура и типы
Отправлено: Waryable от Февраль 05, 2011, 12:50
Ну как бэ... Ответ тут больше метафизический.
Для меня Структура - это набор данных, а не представление некоторой сущности, в отличие от Класса. Структура не самодостаточна и служит только как свод открытых данных(квалификаторы доступа в описании структуры я никогда не использую). Встречая структуру в коде, который я написал год назад, я знаю, что это просто данные, за которыми не скрыто ничего больше. Т.о. для меня Структура и Класс - две разных концепции.  
Код:
Замените их на классы и всё, ИМХО, месить всё  кучу - нехорошо.
Не спорю с вашим ИМХО, но мое ИМХО говорит, что переделать все структуры в классы как раз и будет месивом в куче.


Название: Re: Структура и типы
Отправлено: Waryable от Февраль 05, 2011, 12:52
kuzulis, иногда хорошо. Для обобщения каких-либо данных. Так же если в
классе становится довольно много mutable членов, то лучше их собрать в одну структуру.
Это не отговорка в данном случае. Оберните в Класс.  ;D


Название: Re: Структура и типы
Отправлено: Igors от Февраль 05, 2011, 13:10
Насколько я помню, общее определение "класса" в С++ это: class, struct или union. То есть ++ ничего не имеет против struct и они совсем не являются "пережитком С". Вот примерчик (а то разговор слишком общий)

Код
C++ (Qt)
struct CPoint {
..
// data
float x, y, z;
};
 
Теперь мне надо много всяких утилитарных ф-ций, напр.

Код
C++ (Qt)
inline float Dot( const CPoint & a, const CPoint & b )
{
return a.x * b.x + a.y * b.y + a.z * b.z;
}
 
inline CPoint Cross( const CPoint & a, const CPoint & b )
{
return CPoint(a.y * b.z - a.z * b.y, a.x * b.z - a.z * b.x, a.x * b.y - a.y * b.z);
}
 
// и еще десятка два таких
 
Как Вы это сделаете с "аксессорами" - не устанете ли писать?  :)  Зачем начинать "бег в мешке" если в нем не было никакой необходимости (можно просто бежать) ?






Название: Re: Структура и типы
Отправлено: Fat-Zer от Февраль 05, 2011, 13:36
только union не мешайте в общую кучу, а так единственное различие между классом и структурой - это то, что в структуре все переменные по умолчанию открыты.

По поводу примера: сделать функции друзьями или членами (я обычно использую оператор * для скалярного и ^ для векторного - очень удобно получается). да и пару лишних скобок дописать труда не составит...


Название: Re: Структура и типы
Отправлено: Igors от Февраль 05, 2011, 14:19
только union не мешайте в общую кучу, а так единственное различие между классом и структурой - это то, что в структуре все переменные по умолчанию открыты.
Я не "мешаю", а повторяю определение Страутструпа  :) Кстати union очень интересный зверь, и жаль что (видимо) стандарт изменен и сейчас "union cannot have non-trivial members" - а при прежнем заведующем этого не было.

По поводу примера: сделать функции друзьями или членами (я обычно использую оператор * для скалярного и ^ для векторного - очень удобно получается). да и пару лишних скобок дописать труда не составит...
Верно, я тоже использую операторы * и | (для векторного). Но это хорошо когда "весь текст мой". А если уже есть какое-то приложение и оно использует свой класс, напр. QVector3D. А нужных ф-ций нет, и что делать? Наследоваться от QVector3D - так это бесконечные приведения. Приходится мириться с геттерами/сеттерами которые никакой нагрузки не несут а только путаются под ногами.

На мой взгляд есть масса структур которые никакой "сущностью" не являются. Часто они могут иметь десятки ф-ций членов (напр та же CPoint) и особенно операторов, но все равно они пассивны, так что нечего городить искусственную инкапсуляцию. Если уж на то пошло то методы
Код
C++ (Qt)
float CPoint::getX( void ) const { return x; }
void CPoint::setX( float _x ) { x = _x; }
 
Противоречат идее инкапсуляции по существу. Нигде не должно возникать необходимости доступа только к "x" (конкретно для класса 3D точка).


Название: Re: Структура и типы
Отправлено: Fat-Zer от Февраль 05, 2011, 15:03
Кстати union очень интересный зверь, и жаль что (видимо) стандарт изменен и сейчас "union cannot have non-trivial members" - а при прежнем заведующем этого не было.
Интересный то интересный, но на практике почти не используется... да и оставлен он ИМХО исключительно в целях совместимости с си.
Код
C++ (Qt)
float CPoint::getX( void ) const { return x; }
void CPoint::setX( float _x ) { x = _x; }
[/quote]
Да... c getX() векторное произведение  выглядело бы особенно страшно)
Нигде не должно возникать необходимости доступа только к "x" (конкретно для класса 3D точка).
печать, обход плоскости.
ЗЫ: я тоже не сторонник пихания в риват всего и вся. ;)