|
|
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
обнулить все поля структуры можно, вроде бы как, таким образом: Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 16:22:32 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Еще интересен сам механизм такой инициализации, как я понял, операторы присваивания при ней не вызываются, и происходит это после инициализации конструктором структуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 16:58:06 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
И еще, интересно мнение спецов :), если в структуру включены объекты, то обнуление ее типа memset() как-то уже не совсем справедливо, это может нарушить состояние включенных объектов, которые могут инициализироваться не обязательно нулями для корректной работы. Можно сделать в структуре инициализирующий конструктор, но тогда смысл считать ее структурой, не проще ли относиться к ней как классу. Т.е. где пролегает эта грань, между структурой и классом для правильного программирования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:03:17 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
TubrikИ еще, интересно мнение спецов :), если в структуру включены объекты, то обнуление ее типа memset() как-то уже не совсем справедливо, это может нарушить состояние включенных объектов, которые могут инициализироваться не обязательно нулями для корректной работы. Не то что не совсем справедливо, а безобразие. TubrikМожно сделать в структуре инициализирующий конструктор, но тогда смысл считать ее структурой, не проще ли относиться к ней как классу. Т.е. где пролегает эта грань, между структурой и классом для правильного программирования? Баян, было несколько месяцев назад ищи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:09:57 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
imho класс - объект, составляющие которого, как правило, логически связаны между собой, структура, же это (опять же ;) ) как правило, просто сборище друг от друга не зависящих объектов, с public доступом для всех и вся. Вообще, конечно, все на усмотрение разработчика... -------------------------------------------------------------- [не претендую на уникальность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:10:35 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Cerebrumimho класс - объект, составляющие которого, как правило, логически связаны между собой, структура, же это (опять же ;) ) как правило, просто сборище друг от друга не зависящих объектов, с public доступом для всех и вся. Вообще, конечно, все на усмотрение разработчика... Сборище - это мусор, а не структура. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:14:54 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
я предпочитаю чтобы структуры были POD ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:18:02 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Голенков Владимиря предпочитаю чтобы структуры были POD Для агрегатной инициализации структура не обязательно должна быть POD, главное, чтобы у нее было конструкторов и еще кое-чего ;) : автор 8.5.1 Aggregates [dcl.init.aggr] An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or pro- 1 tected non-static data members (clause 11), no base classes (clause 10), and no virtual functions (10.3). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:32:16 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Голенков Владимиря предпочитаю чтобы структуры были POD согласен, короче: если структура не выходит за рамки С. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:34:24 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrikобнулить все поля структуры можно, вроде бы как, таким образом: Код: plaintext 1. Код: plaintext 1. Для того чтобы корректно "обнулить" поля структуры мы опираемся на следующее утверждение стандарта: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Следовательно, если мы хотим просто "обнулить" структуру, то пишем: Код: plaintext 1. Только MS компиляторы (VC6 точно, остальные не знаю) не понимают empty initializer-list :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:38:08 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
maXmo Голенков Владимиря предпочитаю чтобы структуры были POD согласен, короче: если структура не выходит за рамки С. А зачем себя так ограничивать, в таком свободном языке как C++ ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:40:05 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik wrote: > st s({0}); > > почему-то не работатет, почему? Конструктору присваивания в качестве параметра надо st& или const st&, если конструктор не определен и используется дефолтный. Тип выражения "{0}" неизвестен. Компилиться будет вот так (g++, на msvc не факт, что будет): Код: plaintext 1. вопросы? -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:46:30 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :) Либо полный С, либо полный С++/ООП. Третьего не дано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 17:54:47 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
maXmo Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :) Либо полный С, либо полный С++/ООП. Третьего не дано. "Это был системный аналитик. Он дал исчерпывающий ответ, из которого мы ничего полезного для себя почерпнуть не можем" :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 18:00:24 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Выходит: 1. Для структуры не создается конструктор по-умолчанию, как и конструктор копирования. 1. Список инициализации работает только для структур, где нет явно созданного конструктора. 3. При отсутствии конструктора, для вложенных в структуру переменных классовых типов, их конструкторы все же вызываются. Akh Не то что не совсем справедливо, а безобразие. а как тогда быстро и кратко обнулить структуру типа : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 18:51:31 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
maXmo Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :) Либо полный С, либо полный С++/ООП. Третьего не дано. Борис, ты не ПРАВ!(с) А вот создатели STL с вами были не согласны и наворотили такого из структур и классов..... Так что class == struct и никак не иначе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 18:52:42 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
наворотили – ну и флаг им в руки, кто это воротилово разгребать будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:07:17 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:14:58 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
maXmoнаворотили – ну и флаг им в руки, кто это воротилово разгребать будет? Да они свой флаг несут высоко и долго, многим бы так А от того что ты считаешь что struct это POD, она не поменяет свой сущности. Tubrik просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных Можно все что не запрещено и что не вводит в заблуждение. В данном случае ни того ни другого нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:26:29 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Короче) достал из завалов учебник, порывшись, все-таки оформил для себя понимание структуры исходя из след. двух принципов: 1. Структура является объединением простых переменных. 2. Класс является объединением данных и функция для работы над этими данными (ну и не только). Сделал для себя правило: 1. Хранить в структуре только простые типы данных. 2. Даже не думать манипулировать любыми данными через структуру (т.е. никаких методов внутри). 3. п.1. позволяет беспечно использовать memset() и ему подобные. 4. Если есть необходимость постоянно однообразно изменять данные в структуре, сделать для этого специальную ф-ию. Если кратко: структура - это данные и ничего больше! аж легче стало =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:33:44 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrikа как тогда быстро и кратко обнулить структуру типа : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ? Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:41:38 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
и сразу же нарушил свое же правило, добавив в структуру поля std::string =) в связи с чем внес поправку: Структура - это объединение любых типов данных, без каких-либо возможных манипуляций над данными, как внутренними, так и внешними. (а чем там будут эти данные заниматься внутри структуры - это уже не ее проблемы) Для повторяющихся обнулений и др. переинициализаций использовать внешние ф-ии. Вроде все стыкуется, жаль только memset уже не применишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:41:57 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше: Код: plaintext нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:43:44 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
TubrikКороче) достал из завалов учебник, порывшись, все-таки оформил для себя понимание структуры исходя из след. двух принципов: 1. Структура является объединением простых переменных. 2. Класс является объединением данных и функция для работы над этими данными (ну и не только). Сделал для себя правило: 1. Хранить в структуре только простые типы данных. 2. Даже не думать манипулировать любыми данными через структуру (т.е. никаких методов внутри). 3. п.1. позволяет беспечно использовать memset() и ему подобные. 4. Если есть необходимость постоянно однообразно изменять данные в структуре, сделать для этого специальную ф-ию. Если кратко: структура - это данные и ничего больше! аж легче стало =) А к чему это правило? Структуры могут содержать и пользовательские типы также. По мне, лучше разделять поведенческие сущности - их следует оформлять как класс и инкапсулировать состояние, и вспомогательные сущности - их следует оформлять как структуры и предоставлять открытый доступ к членам данным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:47:56 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков А к чему это правило? Структуры могут содержать и пользовательские типы также. По мне, лучше разделять поведенческие сущности - их следует оформлять как класс и инкапсулировать состояние, и вспомогательные сущности - их следует оформлять как структуры и предоставлять открытый доступ к членам данным. я же уже исправил этот момент ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:50:11 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik Анатолий Широков Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше: Код: plaintext нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода? Для "зануления" подобного рода структур используется тот факт, что для глобальных объектов (и статических в том числе) всегда выполняется так называемая "zero-initialization". Используя это обнулять структуры можно в любом месте с помощью "зануленного" объекта и, как видите, никаких трюков с memset и никаких требований POD: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:53:10 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков Tubrik Анатолий Широков Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше: Код: plaintext нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода? Для "зануления" подобного рода структур используется тот факт, что для глобальных объектов (и статических в том числе) всегда выполняется так называемая "zero-initialization". Используя это обнулять структуры можно в любом месте с помощью "зануленного" объекта и, как видите, никаких трюков с memset и никаких требований POD: Код: plaintext 1. 2. 3. Это даже слишком сложно :) Чтобы обнулить подобного рода структуру достаточно, все лишь:), следующего: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:55:36 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
+ настолько просто, что я бы не догадался сам =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 19:59:02 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik+ настолько просто, что я бы не догадался сам =) Но хочу предупредить, не все компиляторы корректно генерируют код для вызова s = ssTest(); А zero-initialization выполняется всеми мне известными компиляторами. Поэтому иногда обнуление с помощью глобального объекта является единственно возможным безтрюковым вариантом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:04:12 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik wrote: > Для структуры не создается конструктор по-умолчанию, как и конструктор > копирования. Щас тебе. Создается, и он требует себе struct& в качестве аргумента. То же самое с конструктором копирования. > просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, > мне кажется ничего плохого в этом нет, если уверен, что она > (структура) всегда будет содержать в себе только встроенные типы > данных А зачем тебе обнулять структуру? сделай к ней конструктор. > 1. Структура является объединением простых переменных. А что мне мешает включить в структуру класс? >2. Класс является объединением данных и функция для работы над этими >данными (ну и не только). Код: plaintext 1. 2. 3. 4. 5. 6. > Сделал для себя правило: > 1. Хранить в структуре только простые типы данных. Смысл? >2. Даже не думать манипулировать любыми данными через структуру (т.е. >>никаких методов внутри). Почему? > 3. п.1. позволяет беспечно использовать memset() и ему подобные. Никто тебе не запрещает использовать memset для класса, как я понимаю :) 4. Если есть необходимость постоянно однообразно изменять данные в структуре, сделать для этого специальную ф-ию. > Если кратко: > структура - это данные и ничего больше! Ок, а указатель на метод - это данные или функция? -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:11:38 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
ErV Tubrik wrote: > Для структуры не создается конструктор по-умолчанию, как и конструктор > копирования. Щас тебе. Создается, и он требует себе struct& в качестве аргумента. То же самое с конструктором копирования. Для структур являющихся агрегатами этот конструктор очень хитрый. Вот так, например, не будет осуществляться "зануление": Код: plaintext А при явном вызове конструктора, будет : ssTest s = ssTest(); // все члены структуры будут "занулены" Заметьте, насколько это поведение отличается от поведения рукописного конструктора по умолчанию. ErV > просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, > мне кажется ничего плохого в этом нет, если уверен, что она > (структура) всегда будет содержать в себе только встроенные типы > данных А зачем тебе обнулять структуру? сделай к ней конструктор. А вот ерунды советовать не надо. Представьте себе структуру из 40 членов данных - это что же, я в конструкторе должен их всех перечислить, чтобы провести корректное обнуление (я не рассматриваю возможные решения для POD типов, где можно использовать memset). Здесь, как нельзя кстати, не только нужно, но и необходимо использовать сгенерированный компилятором конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:19:44 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
ErV а). а что мешает, если уж так нужно манипулировать данными, назвать ее class вместо struct, добавив слово public, чтобы позволить себе и др. в любой момент понять, что в вашем коде struct подразумевает одно, class - другое? б). потому, что мне так будет удобнее работать со своим кодом (если это не так, то время покажет). г). указатель на метод буду считать данными, ибо _моя_ структура никогда не вызовет этот метод, ибо нечем вызвать д). printf() - буду считать методом манипулирующим над данными, ибо он выводит данные в консоль, чем не манипуляция? разве что-то мешает писать: Код: plaintext 1. 2. е). и так понятно, что все эти разделения лишь дело личного предпочтения и уважения к др. людям, которым может понадобиться использовать этот код. Способ абстрагирования и т.п... тут уже попрет философия, поэтому лучше не надо. На уровне машинного кода вообще нет принципиальной разницы между кодом и данными, и что? Все эти правила лишь для собственного удобства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:23:15 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков Для структур являющихся агрегатами этот конструктор очень хитрый. Вот так, например, не будет осуществляться "зануление": Код: plaintext А при явном вызове конструктора, будет : ssTest s = ssTest(); // все члены структуры будут "занулены" Заметьте, насколько это поведение отличается от поведения рукописного конструктора по умолчанию. у меня в обоих случаях получается мусор, поэтому пока такое решение: делаю статическую ф-ию или обычную, с вложенной статической переменной, типа: Код: plaintext 1. 2. 3. 4. 5. думаю будет работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:29:41 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik ErV а). а что мешает, если уж так нужно манипулировать данными, назвать ее class вместо struct, добавив слово public, чтобы позволить себе и др. в любой момент понять, что в вашем коде struct подразумевает одно, class - другое? б). потому, что мне так будет удобнее работать со своим кодом (если это не так, то время покажет). г). указатель на метод буду считать данными, ибо _моя_ структура никогда не вызовет этот метод, ибо нечем вызвать д). printf() - буду считать методом манипулирующим над данными, ибо он выводит данные в консоль, чем не манипуляция? разве что-то мешает писать: Код: plaintext 1. 2. е). и так понятно, что все эти разделения лишь дело личного предпочтения и уважения к др. людям, которым может понадобиться использовать этот код. Способ абстрагирования и т.п... тут уже попрет философия, поэтому лучше не надо. На уровне машинного кода вообще нет принципиальной разницы между кодом и данными, и что? Все эти правила лишь для собственного удобства. В любом случае, я бы вам не советовал себя настолько ограничивать. Вот хочу, чтобы вы поразмышляли над сущность "ТОЧКА". В своем проекте я его сделал структурой агрегатом с огромным количеством методов, которые в том числе изменяют состояние самого объекта. А структуру я оставил всего лишь для того, чтобы все понимали, что это вспомогательный класс, который имеет легковестный сгенерированный конструктор и который легко можно помещать в контейнеры типа std::vector и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:32:57 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik Анатолий Широков Для структур являющихся агрегатами этот конструктор очень хитрый. Вот так, например, не будет осуществляться "зануление": Код: plaintext А при явном вызове конструктора, будет : ssTest s = ssTest(); // все члены структуры будут "занулены" Заметьте, насколько это поведение отличается от поведения рукописного конструктора по умолчанию. у меня в обоих случаях получается мусор, поэтому пока такое решение: Видимо, вы пользуетесь компилятором от MS. Tubrik делаю статическую ф-ию или обычную, с вложенной статической переменной, типа: Код: plaintext 1. 2. 3. 4. 5. думаю будет работать Можно даже сократить ;) вместо Код: plaintext Код: plaintext Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:36:16 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков я уж лучше подстрахуюсь = {}, всего 3 лишних символа - это не много :) по поводу точки, тут же опять, смотря с какой позиции размышлять, сделали бы вы ее классом, она бы не перестала быть точкой, кроме того было бы сразу видно, что все же? манипуляции над данными будут иметь место, а о легковесности знать, возможно, и не так приоритетно, как о том, что к ней не стоит применять memset(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:41:41 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
подсократил еще немного :) Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:44:12 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
надеюсь окончательный вариант: Код: plaintext 1. 2. 3. 4. 5. чтобы никто не сделал ZeroStruct() = st; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 20:46:35 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrikнадеюсь окончательный вариант: Код: plaintext 1. 2. 3. 4. 5. чтобы никто не сделал ZeroStruct() = st; Никто и не сделает, поскольку результат выполнения функции stStruct ZeroStruct() является r-value, к которому неприменим operator=(); И еще на мой взгляд, помещение функции "обнуления" в интерфейс структуры отражает общность и сокращает имя: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Сравните stStruct::empty() с ZeroStruct(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 22:19:07 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik Анатолий Широков я уж лучше подстрахуюсь = {}, всего 3 лишних символа - это не много :) по поводу точки, тут же опять, смотря с какой позиции размышлять, сделали бы вы ее классом, она бы не перестала быть точкой, кроме того было бы сразу видно, что все же? манипуляции над данными будут иметь место, а о легковесности знать, возможно, и не так приоритетно, как о том, что к ней не стоит применять memset(). О легковесности знать важнее, уверяю вас. Ну да ладно. Не буду мешать зарабатывать вам свои собственные шишки ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 22:23:38 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков wrote: > А вот ерунды советовать не надо. Ерунда или нет - зависит от ситуации. Ситуации не имеем. Tubrik wrote: > а). а что мешает, если уж так нужно манипулировать данными, назвать ее > class вместо struct, добавив слово public, чтобы позволить себе и др. > в любой момент понять, что в вашем коде struct подразумевает одно, > class - другое? структура и класс - это одно и то же. Кроме того, они оба ещё являются пространствами имен. Соответственно, слово struct или класс сакрального смысла себе не несет, различие только в дефолтном разрешении на доступ > б). потому, что мне так будет удобнее работать со своим кодом (если > это не так, то время покажет). Не обижайся, но для меня это выглядит, как пустая трата времени. У тебя есть гибкий и подвижный язык - C++. Теперь ты хочешь сделать для себя одно корявое и неудобное правило, чтобы его испортить. Представь, что ты, говоря по русски, решил себе добавить ещё одно правило, например не употреблять слова, начинающиеся с буквы "в", после слов, начинающихся с буквы "а". Смысл в этом есть? Может, и есть. Но, скорее всего, нету. Вот так же и с разделением класс/структура. Какая разница, в каком случае что использовать? Используй то, что удобнее в данном случае, не надо из пальца правила высасывать. Просто работай так, чтобы тебе было удобно на этом языке писАть, и желательно, на нем же и думать. Вот и все. Ты в данный момент, просто, по-моему, тратишь кучу времени на бесполезную мелочь, которая никакой отдачи не принесет. Это из разряда с негласным запретом на использование goto. Иногда он не нужен, но есть ситуации, когда без трудно не обойтись, и с использованием goto код получается более кратким и понятным. То же самое с рекомендациями не использовать много макросов. Да, есть ситуация, когда макросы запутывают программы. Но бывает ситуация, когд надо, например, сделать функцию, возвращающую числовое имя ошибки для её кода. Тогда быстрее воспользоваться макросом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. И так с любыми гласными/негласными запретами. Просто пиши так, как тебе удобно, и не загоняйся с выдумыванием правил типа этого. struct или class - это не принципиально. -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 22:51:12 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковИ еще на мой взгляд, помещение функции "обнуления" в интерфейс структуры отражает общность и сокращает имя: насчет общности готов согласиться и объявить ф-ию внутри, но только потому, что она статическая :) Анатолий ШироковНикто и не сделает, поскольку результат выполнения функции stStruct ZeroStruct() является r-value, к которому неприменим operator=(); очень даже сделает, вы пропустили знак stStruct & ZeroStruct() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 23:15:04 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
On Thu, 06 Dec 2007 22:51:12 +0300, ErV <nospam@sql.ru> wrote: > И так с любыми гласными/негласными запретами. Просто пиши так, как тебе > удобно, и не загоняйся с выдумыванием правил типа этого. struct или > class - это не принципиально. +1 Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 23:27:00 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
ErV Еще раз повторюсь, это дело личного предпочтения, просто я решил считать, что если язык не запрещает, то это еще не значит, что это надо использовать. Со временем, возможно, я изменю точку зрения, если найду это в чем-то неэффективным. Про подстановку букв пример не слишком удачный и очень отстраненный от темы. Синтаксис русского языка не запрещает ругаться матом, но не все делают это везде, где вздумается, т.к. есть места, где это, по крайней мере, не разумно делать. Чем не ограничение? Синтаксис С++ не обязывает писать имена переменных класса с "m_", имена классов с большой буквы, и т.д. и т.п., но некоторые так делают, и я в их числе. Можно не использовать классы, и даже ф-ии, это язык тоже не запрещает. Ну а что тут такого? Может так кому удобно! Я не считаю, что "порчу" С++ или как-то ограничиваю его подвижность, а просто выбираю более удобное слово для использования, чтобы более точно (для себя) отразить замысел какого-то момента. К примеру, если более удобно использовать typename, чем class в шаблонах, то я не вижу ничего отрицательного в этом, никакого ущемления языка. Какой-то (не помню) автор книги по правилам "хорошего" тона в С++ сказал, что этот язык слишком уж гибкий, чтобы не вводить подобные ограничения. По-твоему все эти книги с рекомендациями можно смело в топку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2007, 23:45:05 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik Akh Не то что не совсем справедливо, а безобразие. а как тогда быстро и кратко обнулить структуру типа : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ? Да за ради бога, только если там примитивные типы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 09:37:29 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrikпросто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных аналогично. Лично мне это больше по душе, чем {0}. У меня психологически это ассоциируется только с первым элементом. Мало ли чего там в следующем стандарте наворотят. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 09:39:14 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrikи сразу же нарушил свое же правило, добавив в структуру поля std::string =) в связи с чем внес поправку: Структура - это объединение любых типов данных, без каких-либо возможных манипуляций над данными, как внутренними, так и внешними. (а чем там будут эти данные заниматься внутри структуры - это уже не ее проблемы) Для повторяющихся обнулений и др. переинициализаций использовать внешние ф-ии. Вроде все стыкуется, жаль только memset уже не применишь. А чего констктор не применить для обнулений? Поехала теория? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 09:43:21 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
blindedИ снова мир поделился на остро- и тупоконечников. Аминь Сейчас опять ретроградами будешь обзываться? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 09:44:02 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков TubrikВот хочу, чтобы вы поразмышляли над сущность "ТОЧКА". +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 10:03:38 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Akh 1. Использовать memset() опасно, т.к. нет гарантии, что в какой-то момент в структуру не придется включить тип данных, который корректно сбрасывается не нулями. 2. Если в структуре много переменных представьте размер конструктора. К тому же конструктор лишит возможности использовать инициализацию типа = {x1, x2, ..., xn}, значит придется делать еще один конструктор, принимающий переменные, не меньшего размера. Насколько проще использовать вариант, предложенный Анатолием использовать глобальный объект: Код: plaintext 1. 2. 3. 4. 5. разве не так? Пускай даже эта ф-ия будет частью структуры, которую она обнуляет, но даже так будет кратче, чем использовать конструкторы. А если нужно "обнулять" не нулями, то можно аналогично: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 10:48:04 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik 1. Только для тех, где есть гарантия и используй. Кстати, в таких обычно и функций нет. 2. Одна крайнасть хороша, и другая хороша, а истина где-то посередине. Задачу можно решить разными способами, но для конкретного применения один способ более подходящий чем другой. Ты решил, что я против мемсета? Интересно где это я написал, вроде бы пишу обратное. ;) Еще к вопросу с большим количеством свойств можно добавить, что зачастую тут имеют место для жизни вложенные структуры, далее - иерархии наследования, далее - аналогичные данные - аналогичные структруры. 3. Ну, почему бы нет. Статическая зерроинициализация - тоже один из вариантов реализации, следовательно и он имеет право на жизнь. Кстати, опять же вопрос - а не отменят ее в будущем? Сомневаюсь, конечно, но могут придумать какой-нибудь спецификатор - zero, и если его не указать, то будет мусор. Врядли, конечно, - не такая уж она и напряжная. "К людям надо мягше, а на вопросы смотреть ширше". ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 11:09:11 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
против memset() уже я сам стал :) вряд ли отменят или сделают что-то, что создаст серьезные проблемы при компиляции уже имеющихся сырцов, скорее могут добавить что-то новое думаю тема исчерпана, всем спасибо за участие) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 11:20:53 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik wrote: > Синтаксис С++ не обязывает писать имена переменных класса с "m_", > имена классов с большой буквы, и т.д. и т.п., но некоторые так делают, > и я в их числе. Ну а я не делаю :) Посмотри исодники Qt4 - там этого (ИМХО) маразма нет. Хотя *иногда* это может быть удобно. > Я не считаю, что "порчу" С++ или как-то ограничиваю его подвижность, а > просто выбираю более удобное слово для использования, чтобы более > точно (для себя) отразить замысел какого-то момента. Класс и структура идентичны (можешь считать, что struct - это хитрый макрос, который добавляет к классу public: доступ). Так что "замысел момента" ты придумываешь :). Ну и лично я считаю, что повесив правило на язык, ты лишаешь себя возможности наломать дров и научиться чему-то новому в результате. > Какой-то (не помню) автор книги по правилам "хорошего" тона в С++ > сказал, что этот язык слишком уж гибкий, чтобы не вводить подобные > ограничения. По-твоему все эти книги с рекомендациями можно смело в > топку? Да. Книгу берем, читаем, обдумываем позицию автора, соглашаемся или не соглашаемся с ней, затем берем что-то, что удобно/полезно лично мне, а все остальное посылаем нафиг. Гибкость не для создания правил, а для нахождения удобного тебе способа написания программ. А правила будут слишком статичными, тем более не для всех задач они подходят. Ну нельзя следовать одному какому-то "единственно верному" принципу. Так же нет смысла везде использовать ООП или "не ООП" программирование и т.д. и т.п. > против memset() уже я сам стал :) Знаешь, создатели Open Dynamics Engine (или похожей библиотеки) однажду ругались, что VC++ какой-то версии, при создании массива структур или классов, для каждой из них *вызывает* *пустой* конструктор, причем для каждого элемента (это если такой есть) или делает что-то похожее. Теперь прикинь количество вызовов функций при размере массива в несколько десятков миллионов элементов. Это вызывало тормоза. С memset'ом таких проблем не было. Вот и думай :) Все от ситуации зависит. -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 14:49:49 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
ErV > против memset() уже я сам стал :) Знаешь, создатели Open Dynamics Engine (или похожей библиотеки) однажду ругались, что VC++ какой-то версии, при создании массива структур или классов, для каждой из них *вызывает* *пустой* конструктор, причем для каждого элемента (это если такой есть) или делает что-то похожее. Теперь прикинь количество вызовов функций при размере массива в несколько десятков миллионов элементов. Это вызывало тормоза. С memset'ом таких проблем не было. Вот и думай :) Все от ситуации зависит. Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну тогда протестируй: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:18:32 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков wrote: > Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну > тогда протестируй: Можно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз войти/выйти в процедуру, или заполнить диапазон нулями одной процедурой. Но мне почему-то лень этим заниматсья. -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:31:57 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
ErVМожно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз войти/выйти в процедуру, или заполнить диапазон нулями одной процедурой. Но мне почему-то лень этим заниматсья. Не одной быстротой сыт код. ЗЫ: по мотивам пословицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:34:35 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
ErV Анатолий Широков wrote: > Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну > тогда протестируй: Можно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз войти/выйти в процедуру, или заполнить диапазон нулями одной процедурой. Но мне почему-то лень этим заниматсья. -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 Вот и славно, поэтому не надо голословными утверждениями (вы не привели точной ссылки) вводить в заблуждение о полезности memset - поскольку на самом деле, практика показывает, что применение memset весьма ограничено и это использование всегда на гране фола, в отличие от штатных средств языка C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:35:04 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков Ага, щаз. То есть, memset - это дармовая функция, по вашему? не тестировал, но в случае с >при размере массива в несколько десятков миллионов элементов, думаю, все же будет выигрыш, т.к. в memset() для обнуления не нужно использовать косвенную адресацию для вызова эти конструкторов или нечто подобное, но тут мы остановились не на "каждоразовом" вызове пустого конструктора, а на побитовом копировании готового объекта, кажется есть разница? ErV Так что "замысел момента" ты придумываешь :). ты прав, я придумал, все дело в мыслях, но никто не может сказать, чья мысль правильнее ErV А правила будут слишком статичными, тем более не для всех задач они подходят. тоже верно, на любое правило есть исключение, если будет нужно очень, я нарушу их, поэтому предпочту называть их не правилами, а рекомендациями, применимыми в большем кол-ве случаев ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:37:46 |
|
||
|
инициализация структуры
|
|||
|---|---|---|---|
|
#18+
Tubrik Анатолий Широков Ага, щаз. То есть, memset - это дармовая функция, по вашему? не тестировал, но в случае с >при размере массива в несколько десятков миллионов элементов, думаю, все же будет выигрыш, т.к. в memset() для обнуления не нужно использовать косвенную адресацию для вызова эти конструкторов или нечто подобное, но тут мы остановились не на "каждоразовом" вызове пустого конструктора, а на побитовом копировании готового объекта, кажется есть разница? Как я понял автора, мы не сравниваем вызов memset для всех 100000 элементов, а сравнимаем что лучше: zero-инициализация средствами компилятора против memset для тойже структуры, то memset явно проигрывает. Если речь идет о занулении массива из 1000000 POD объектов средствами memset, то memset, конечно, "рулит". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:43:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2027678]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
215ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
91ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 577ms |

| 0 / 0 |
