powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация структуры
61 сообщений из 61, показаны все 3 страниц
инициализация структуры
    #34991823
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обнулить все поля структуры можно, вроде бы как, таким образом:
Код: plaintext
1.
st s = { 0 };
но
Код: plaintext
1.
st s({ 0 });
почему-то не работатет, почему?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992031
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще интересен сам механизм такой инициализации, как я понял, операторы присваивания при ней не вызываются, и происходит это после инициализации конструктором структуры.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992055
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще, интересно мнение спецов :), если в структуру включены объекты, то обнуление ее типа memset() как-то уже не совсем справедливо, это может нарушить состояние включенных объектов, которые могут инициализироваться не обязательно нулями для корректной работы.
Можно сделать в структуре инициализирующий конструктор, но тогда смысл считать ее структурой, не проще ли относиться к ней как классу. Т.е. где пролегает эта грань, между структурой и классом для правильного программирования?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992087
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TubrikИ еще, интересно мнение спецов :), если в структуру включены объекты, то обнуление ее типа memset() как-то уже не совсем справедливо, это может нарушить состояние включенных объектов, которые могут инициализироваться не обязательно нулями для корректной работы.

Не то что не совсем справедливо, а безобразие.

TubrikМожно сделать в структуре инициализирующий конструктор, но тогда смысл считать ее структурой, не проще ли относиться к ней как классу. Т.е. где пролегает эта грань, между структурой и классом для правильного программирования?

Баян, было несколько месяцев назад ищи.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992090
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imho класс - объект, составляющие которого, как правило, логически связаны между собой, структура, же это (опять же ;) ) как правило, просто сборище друг от друга не зависящих объектов, с public доступом для всех и вся. Вообще, конечно, все на усмотрение разработчика...
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
инициализация структуры
    #34992114
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц

Кстати, сейчас начал склоняться к т/з Мастера Зива.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992124
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumimho класс - объект, составляющие которого, как правило, логически связаны между собой, структура, же это (опять же ;) ) как правило, просто сборище друг от друга не зависящих объектов, с public доступом для всех и вся. Вообще, конечно, все на усмотрение разработчика...

Сборище - это мусор, а не структура. ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992145
я предпочитаю чтобы структуры были POD
...
Рейтинг: 0 / 0
инициализация структуры
    #34992201
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимиря предпочитаю чтобы структуры были 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.
struct person_info
{
   std::string name;
   std::string female;
};

...

person_info person= {"Ivan", "Ivanov"}; // ok


...
Рейтинг: 0 / 0
инициализация структуры
    #34992215
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимиря предпочитаю чтобы структуры были POD согласен, короче: если структура не выходит за рамки С.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992234
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikобнулить все поля структуры можно, вроде бы как, таким образом:
Код: plaintext
1.
st s = { 0 };
но
Код: plaintext
1.
st s({ 0 });
почему-то не работатет, почему?

Для того чтобы корректно "обнулить" поля структуры мы опираемся на следующее утверждение стандарта:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 7   If there are fewer initializers in the list than there are members in the aggregate, then each member not
  explicitly initialized shall be value-initialized ( 8 . 5 ). [Example:
        struct S { int a; char* b; int c; };
        S ss = {  1 , "asdf" };
  initializes ss.a with  1 , ss.b with "asdf", and ss.c with the value of an expression of the form
  int(), that is,  0 . ]
 8   An initializer for an aggregate member that is an empty class shall have the form of an empty initializer-list
  {}. [Example:
        struct S { };
        struct A {
                    S s;
                    int i;
        } a = { { } ,  3  };
   —end example] An empty initializer-list can be used to initialize any aggregate. If the aggregate is not an
  empty class, then each member of the aggregate shall be initialized with a value of the form T() ( 5 . 2 . 3 ),
  where T represents the type of the uninitialized member.

Следовательно, если мы хотим просто "обнулить" структуру, то пишем:

Код: plaintext
1.
st s = {};

Только MS компиляторы (VC6 точно, остальные не знаю) не понимают empty initializer-list :(
...
Рейтинг: 0 / 0
инициализация структуры
    #34992244
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Голенков Владимиря предпочитаю чтобы структуры были POD согласен, короче: если структура не выходит за рамки С.

А зачем себя так ограничивать, в таком свободном языке как C++ ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992283
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik wrote:

> st s({0});
>
> почему-то не работатет, почему?
Конструктору присваивания в качестве параметра надо st& или const st&,
если конструктор не определен и используется дефолтный.

Тип выражения "{0}" неизвестен.

Компилиться будет вот так (g++, на msvc не факт, что будет):
Код: plaintext
1.
st s((st){ 0 }), мое

вопросы?
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34992328
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :)
Либо полный С, либо полный С++/ООП. Третьего не дано.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992346
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :)
Либо полный С, либо полный С++/ООП. Третьего не дано.

"Это был системный аналитик. Он дал исчерпывающий ответ, из которого мы ничего полезного для себя почерпнуть не можем" :D
...
Рейтинг: 0 / 0
инициализация структуры
    #34992483
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выходит:
1. Для структуры не создается конструктор по-умолчанию, как и конструктор копирования.
1. Список инициализации работает только для структур, где нет явно созданного конструктора.
3. При отсутствии конструктора, для вложенных в структуру переменных классовых типов, их конструкторы все же вызываются.

Akh
Не то что не совсем справедливо, а безобразие.


а как тогда быстро и кратко обнулить структуру типа :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct stTest
{
	int a;
	double b;
	/*... 
	огромный список
	...*/
};

?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992487
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Анатолий ШироковА зачем себя так ограничивать, в таком свободном языке как C++ ;)ибо нефиг :)
Либо полный С, либо полный С++/ООП. Третьего не дано.
Борис, ты не ПРАВ!(с)
А вот создатели STL с вами были не согласны и наворотили такого из структур и классов..... Так что class == struct и никак не иначе
...
Рейтинг: 0 / 0
инициализация структуры
    #34992519
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наворотили – ну и флаг им в руки, кто это воротилово разгребать будет?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992533
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных
...
Рейтинг: 0 / 0
инициализация структуры
    #34992547
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoнаворотили – ну и флаг им в руки, кто это воротилово разгребать будет?
Да они свой флаг несут высоко и долго, многим бы так
А от того что ты считаешь что struct это POD, она не поменяет свой сущности.
Tubrik
просто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных

Можно все что не запрещено и что не вводит в заблуждение. В данном случае ни того ни другого нет
...
Рейтинг: 0 / 0
инициализация структуры
    #34992561
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче) достал из завалов учебник, порывшись, все-таки оформил для себя понимание структуры исходя из след. двух принципов:

1. Структура является объединением простых переменных.
2. Класс является объединением данных и функция для работы над этими данными (ну и не только).

Сделал для себя правило:
1. Хранить в структуре только простые типы данных.
2. Даже не думать манипулировать любыми данными через структуру (т.е. никаких методов внутри).
3. п.1. позволяет беспечно использовать memset() и ему подобные.
4. Если есть необходимость постоянно однообразно изменять данные в структуре, сделать для этого специальную ф-ию.

Если кратко:
структура - это данные и ничего больше!

аж легче стало =)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992577
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikа как тогда быстро и кратко обнулить структуру типа :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct stTest
{
	int a;
	double b;
	/*... 
	огромный список
	...*/
};

?

Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше:

Код: plaintext
stTest s = {};
...
Рейтинг: 0 / 0
инициализация структуры
    #34992578
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и сразу же нарушил свое же правило, добавив в структуру поля std::string =)

в связи с чем внес поправку:

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

Вроде все стыкуется, жаль только memset уже не применишь.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992581
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше:
Код: plaintext
stTest s = {};


нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода?
...
Рейтинг: 0 / 0
инициализация структуры
    #34992592
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И снова мир поделился на остро- и тупоконечников. Аминь
...
Рейтинг: 0 / 0
инициализация структуры
    #34992593
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TubrikКороче) достал из завалов учебник, порывшись, все-таки оформил для себя понимание структуры исходя из след. двух принципов:

1. Структура является объединением простых переменных.
2. Класс является объединением данных и функция для работы над этими данными (ну и не только).

Сделал для себя правило:
1. Хранить в структуре только простые типы данных.
2. Даже не думать манипулировать любыми данными через структуру (т.е. никаких методов внутри).
3. п.1. позволяет беспечно использовать memset() и ему подобные.
4. Если есть необходимость постоянно однообразно изменять данные в структуре, сделать для этого специальную ф-ию.

Если кратко:
структура - это данные и ничего больше!

аж легче стало =)

А к чему это правило? Структуры могут содержать и пользовательские типы также. По мне, лучше разделять поведенческие сущности - их следует оформлять как класс и инкапсулировать состояние, и вспомогательные сущности - их следует оформлять как структуры и предоставлять открытый доступ к членам данным.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992600
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков

А к чему это правило? Структуры могут содержать и пользовательские типы также. По мне, лучше разделять поведенческие сущности - их следует оформлять как класс и инкапсулировать состояние, и вспомогательные сущности - их следует оформлять как структуры и предоставлять открытый доступ к членам данным.

я же уже исправил этот момент
...
Рейтинг: 0 / 0
инициализация структуры
    #34992607
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik Анатолий Широков
Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше:
Код: plaintext
stTest s = {};


нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода?

Для "зануления" подобного рода структур используется тот факт, что для глобальных объектов (и статических в том числе) всегда выполняется так называемая "zero-initialization". Используя это обнулять структуры можно в любом месте с помощью "зануленного" объекта и, как видите, никаких трюков с memset и никаких требований POD:


Код: plaintext
1.
2.
3.
ssTest globalEmptyObject; // компилятор сам выполнит zero-initialization

// в любом месте программы
ssTest s(globalEmptyObject);
...
Рейтинг: 0 / 0
инициализация структуры
    #34992613
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков Tubrik Анатолий Широков
Вы выборочно читаете ленту? Я уже ответил на этот вопрос выше:
Код: plaintext
stTest s = {};


нет, стараюсь читать внимательно, но я спросил "как обнулить", а не "инициализировать", вы таким образом можете обнулить ее в любом месте кода?

Для "зануления" подобного рода структур используется тот факт, что для глобальных объектов (и статических в том числе) всегда выполняется так называемая "zero-initialization". Используя это обнулять структуры можно в любом месте с помощью "зануленного" объекта и, как видите, никаких трюков с memset и никаких требований POD:


Код: plaintext
1.
2.
3.
ssTest globalEmptyObject; // компилятор сам выполнит zero-initialization

// в любом месте программы
ssTest s(globalEmptyObject);



Это даже слишком сложно :) Чтобы обнулить подобного рода структуру достаточно, все лишь:), следующего:

Код: plaintext
1.
ssTest s; // мусор из стека
s = ssTest(); // обнуление
...
Рейтинг: 0 / 0
инициализация структуры
    #34992617
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
настолько просто, что я бы не догадался сам =)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992628
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik+
настолько просто, что я бы не догадался сам =)

Но хочу предупредить, не все компиляторы корректно генерируют код для вызова
s = ssTest();

А zero-initialization выполняется всеми мне известными компиляторами. Поэтому иногда обнуление с помощью глобального объекта является единственно возможным безтрюковым вариантом.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992636
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik wrote:

> Для структуры не создается конструктор по-умолчанию, как и конструктор
> копирования.
Щас тебе. Создается, и он требует себе struct& в качестве аргумента.
То же самое с конструктором копирования.

> просто скажите кто как обнуляет структуру? я всегда юзал memset(), и,
> мне кажется ничего плохого в этом нет, если уверен, что она
> (структура) всегда будет содержать в себе только встроенные типы
> данных
А зачем тебе обнулять структуру? сделай к ней конструктор.

> 1. Структура является объединением простых переменных.
А что мне мешает включить в структуру класс?

>2. Класс является объединением данных и функция для работы над этими
>данными (ну и не только).
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <stdio.h>
class A{
        void foo(){
                printf("hw!\n");
        }
};
Ну и где данные?

> Сделал для себя правило:
> 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
...
Рейтинг: 0 / 0
инициализация структуры
    #34992648
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Tubrik wrote:

> Для структуры не создается конструктор по-умолчанию, как и конструктор
> копирования.
Щас тебе. Создается, и он требует себе struct& в качестве аргумента.
То же самое с конструктором копирования.

Для структур являющихся агрегатами этот конструктор очень хитрый. Вот так, например, не будет осуществляться "зануление":

Код: plaintext
ssTest s; // в полях будет мусор

А при явном вызове конструктора, будет :
ssTest s = ssTest(); // все члены структуры будут "занулены"

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

ErV
> просто скажите кто как обнуляет структуру? я всегда юзал memset(), и,
> мне кажется ничего плохого в этом нет, если уверен, что она
> (структура) всегда будет содержать в себе только встроенные типы
> данных
А зачем тебе обнулять структуру? сделай к ней конструктор.

А вот ерунды советовать не надо. Представьте себе структуру из 40 членов данных - это что же, я в конструкторе должен их всех перечислить, чтобы провести корректное обнуление (я не рассматриваю возможные решения для POD типов, где можно использовать memset). Здесь, как нельзя кстати, не только нужно, но и необходимо использовать сгенерированный компилятором конструктор.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992653
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV


а). а что мешает, если уж так нужно манипулировать данными, назвать ее class вместо struct, добавив слово public, чтобы позволить себе и др. в любой момент понять, что в вашем коде struct подразумевает одно, class - другое?

б). потому, что мне так будет удобнее работать со своим кодом (если это не так, то время покажет).

г). указатель на метод буду считать данными, ибо _моя_ структура никогда не вызовет этот метод, ибо нечем вызвать

д). printf() - буду считать методом манипулирующим над данными, ибо он выводит данные в консоль, чем не манипуляция? разве что-то мешает писать:

Код: plaintext
1.
2.
int a;
printf("%d", ++a);

е). и так понятно, что все эти разделения лишь дело личного предпочтения и уважения к др. людям, которым может понадобиться использовать этот код. Способ абстрагирования и т.п... тут уже попрет философия, поэтому лучше не надо. На уровне машинного кода вообще нет принципиальной разницы между кодом и данными, и что? Все эти правила лишь для собственного удобства.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992663
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Для структур являющихся агрегатами этот конструктор очень хитрый. Вот так, например, не будет осуществляться "зануление":

Код: plaintext
ssTest s; // в полях будет мусор

А при явном вызове конструктора, будет :
ssTest s = ssTest(); // все члены структуры будут "занулены"

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


у меня в обоих случаях получается мусор, поэтому пока такое решение:

делаю статическую ф-ию или обычную, с вложенной статической переменной, типа:

Код: plaintext
1.
2.
3.
4.
5.
void MyObj::ZeroStruct(stMyStruct& st)
{
	static stMyStruct zero_obj = {};
	st = zero_obj;
}

думаю будет работать
...
Рейтинг: 0 / 0
инициализация структуры
    #34992667
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik ErV


а). а что мешает, если уж так нужно манипулировать данными, назвать ее class вместо struct, добавив слово public, чтобы позволить себе и др. в любой момент понять, что в вашем коде struct подразумевает одно, class - другое?

б). потому, что мне так будет удобнее работать со своим кодом (если это не так, то время покажет).

г). указатель на метод буду считать данными, ибо _моя_ структура никогда не вызовет этот метод, ибо нечем вызвать

д). printf() - буду считать методом манипулирующим над данными, ибо он выводит данные в консоль, чем не манипуляция? разве что-то мешает писать:

Код: plaintext
1.
2.
int a;
printf("%d", ++a);

е). и так понятно, что все эти разделения лишь дело личного предпочтения и уважения к др. людям, которым может понадобиться использовать этот код. Способ абстрагирования и т.п... тут уже попрет философия, поэтому лучше не надо. На уровне машинного кода вообще нет принципиальной разницы между кодом и данными, и что? Все эти правила лишь для собственного удобства.

В любом случае, я бы вам не советовал себя настолько ограничивать. Вот хочу, чтобы вы поразмышляли над сущность "ТОЧКА". В своем проекте я его сделал структурой агрегатом с огромным количеством методов, которые в том числе изменяют состояние самого объекта. А структуру я оставил всего лишь для того, чтобы все понимали, что это вспомогательный класс, который имеет легковестный сгенерированный конструктор и который легко можно помещать в контейнеры типа std::vector и т.п.
...
Рейтинг: 0 / 0
инициализация структуры
    #34992669
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik Анатолий Широков
Для структур являющихся агрегатами этот конструктор очень хитрый. Вот так, например, не будет осуществляться "зануление":

Код: plaintext
ssTest s; // в полях будет мусор

А при явном вызове конструктора, будет :
ssTest s = ssTest(); // все члены структуры будут "занулены"

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


у меня в обоих случаях получается мусор, поэтому пока такое решение:


Видимо, вы пользуетесь компилятором от MS.

Tubrik
делаю статическую ф-ию или обычную, с вложенной статической переменной, типа:

Код: plaintext
1.
2.
3.
4.
5.
void MyObj::ZeroStruct(stMyStruct& st)
{
	static stMyStruct zero_obj = {};
	st = zero_obj;
}

думаю будет работать

Можно даже сократить ;)
вместо
Код: plaintext
	static stMyStruct zero_obj = {};
оставить
Код: plaintext
	static stMyStruct zero_obj;
и тоже все будет работать, поскольку в данном случае компилятор сам выполнить "zero-initializatio".
Удачи!
...
Рейтинг: 0 / 0
инициализация структуры
    #34992676
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков

я уж лучше подстрахуюсь = {}, всего 3 лишних символа - это не много :)

по поводу точки, тут же опять, смотря с какой позиции размышлять, сделали бы вы ее классом, она бы не перестала быть точкой, кроме того было бы сразу видно, что все же? манипуляции над данными будут иметь место, а о легковесности знать, возможно, и не так приоритетно, как о том, что к ней не стоит применять memset().
...
Рейтинг: 0 / 0
инициализация структуры
    #34992681
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подсократил еще немного :)
Код: plaintext
1.
2.
3.
4.
5.
stStruct ZeroStruct()
{
	static stStruct zero_obj;
	return zero_obj;
}
...
Рейтинг: 0 / 0
инициализация структуры
    #34992686
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надеюсь окончательный вариант:

Код: plaintext
1.
2.
3.
4.
5.
const stStruct& ZeroStruct()
{
	static stStruct zero_obj;
	return zero_obj;
}

чтобы никто не сделал
ZeroStruct() = st;
...
Рейтинг: 0 / 0
инициализация структуры
    #34992801
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikнадеюсь окончательный вариант:

Код: plaintext
1.
2.
3.
4.
5.
const stStruct& ZeroStruct()
{
	static stStruct zero_obj;
	return zero_obj;
}

чтобы никто не сделал
ZeroStruct() = st;

Никто и не сделает, поскольку результат выполнения функции stStruct ZeroStruct() является r-value, к которому неприменим operator=();

И еще на мой взгляд, помещение функции "обнуления" в интерфейс структуры отражает общность и сокращает имя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// header.h

struct stStruct {
     ....
     static stStruct empty() {
         static stStruct temp;
         return temp;
     }
};

Сравните stStruct::empty() с ZeroStruct().
...
Рейтинг: 0 / 0
инициализация структуры
    #34992809
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik Анатолий Широков

я уж лучше подстрахуюсь = {}, всего 3 лишних символа - это не много :)

по поводу точки, тут же опять, смотря с какой позиции размышлять, сделали бы вы ее классом, она бы не перестала быть точкой, кроме того было бы сразу видно, что все же? манипуляции над данными будут иметь место, а о легковесности знать, возможно, и не так приоритетно, как о том, что к ней не стоит применять memset().

О легковесности знать важнее, уверяю вас. Ну да ладно. Не буду мешать зарабатывать вам свои собственные шишки ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34992833
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков 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.
const char* glErrorString(GLuint error){
        switch (error){
#define branch(p) case(p): return #p; 
        branch(GL_NO_ERROR)
        branch(GL_INVALID_ENUM)
        branch(GL_INVALID_VALUE)
        branch(GL_INVALID_OPERATION)
        branch(GL_STACK_OVERFLOW)
        branch(GL_STACK_UNDERFLOW)
        branch(GL_OUT_OF_MEMORY)
        branch(GL_TABLE_TOO_LARGE)
                default:
                        return "Unknown error\n";
#undef  branch
        };
}


И так с любыми гласными/негласными запретами. Просто пиши так, как тебе
удобно, и не загоняйся с выдумыванием правил типа этого. struct или
class - это не принципиально.
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34992860
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковИ еще на мой взгляд, помещение функции "обнуления" в интерфейс структуры отражает общность и сокращает имя:

насчет общности готов согласиться и объявить ф-ию внутри, но только потому, что она статическая :)

Анатолий ШироковНикто и не сделает, поскольку результат выполнения функции stStruct ZeroStruct() является r-value, к которому неприменим operator=();

очень даже сделает, вы пропустили знак stStruct & ZeroStruct()
...
Рейтинг: 0 / 0
инициализация структуры
    #34992869
Leshij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On Thu, 06 Dec 2007 22:51:12 +0300, ErV <nospam@sql.ru>; wrote:

> И так с любыми гласными/негласными запретами. Просто пиши так, как тебе
> удобно, и не загоняйся с выдумыванием правил типа этого. struct или
> class - это не принципиально.

+1
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34992885
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV


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

Про подстановку букв пример не слишком удачный и очень отстраненный от темы. Синтаксис русского языка не запрещает ругаться матом, но не все делают это везде, где вздумается, т.к. есть места, где это, по крайней мере, не разумно делать. Чем не ограничение?
Синтаксис С++ не обязывает писать имена переменных класса с "m_", имена классов с большой буквы, и т.д. и т.п., но некоторые так делают, и я в их числе.
Можно не использовать классы, и даже ф-ии, это язык тоже не запрещает. Ну а что тут такого? Может так кому удобно!

Я не считаю, что "порчу" С++ или как-то ограничиваю его подвижность, а просто выбираю более удобное слово для использования, чтобы более точно (для себя) отразить замысел какого-то момента. К примеру, если более удобно использовать typename, чем class в шаблонах, то я не вижу ничего отрицательного в этом, никакого ущемления языка.

Какой-то (не помню) автор книги по правилам "хорошего" тона в С++ сказал, что этот язык слишком уж гибкий, чтобы не вводить подобные ограничения. По-твоему все эти книги с рекомендациями можно смело в топку?
...
Рейтинг: 0 / 0
инициализация структуры
    #34993161
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik Akh
Не то что не совсем справедливо, а безобразие.


а как тогда быстро и кратко обнулить структуру типа :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct stTest
{
	int a;
	double b;
	/*... 
	огромный список
	...*/
};

?

Да за ради бога, только если там примитивные типы.
...
Рейтинг: 0 / 0
инициализация структуры
    #34993169
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikпросто скажите кто как обнуляет структуру? я всегда юзал memset(), и, мне кажется ничего плохого в этом нет, если уверен, что она (структура) всегда будет содержать в себе только встроенные типы данных

аналогично. Лично мне это больше по душе, чем {0}. У меня психологически это ассоциируется только с первым элементом. Мало ли чего там в следующем стандарте наворотят. :)
...
Рейтинг: 0 / 0
инициализация структуры
    #34993182
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikи сразу же нарушил свое же правило, добавив в структуру поля std::string =)

в связи с чем внес поправку:

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

Вроде все стыкуется, жаль только memset уже не применишь.

А чего констктор не применить для обнулений?

Поехала теория? ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34993184
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedИ снова мир поделился на остро- и тупоконечников. Аминь

Сейчас опять ретроградами будешь обзываться? ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34993225
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков TubrikВот хочу, чтобы вы поразмышляли над сущность "ТОЧКА".

+1
...
Рейтинг: 0 / 0
инициализация структуры
    #34993347
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh

1. Использовать memset() опасно, т.к. нет гарантии, что в какой-то момент в структуру не придется включить тип данных, который корректно сбрасывается не нулями.
2. Если в структуре много переменных представьте размер конструктора. К тому же конструктор лишит возможности использовать инициализацию типа = {x1, x2, ..., xn}, значит придется делать еще один конструктор, принимающий переменные, не меньшего размера.
Насколько проще использовать вариант, предложенный Анатолием использовать глобальный объект:

Код: plaintext
1.
2.
3.
4.
5.
const stStruct& ZeroStruct()
{
	static const stStruct zero_obj;
	return zero_obj;
}

разве не так? Пускай даже эта ф-ия будет частью структуры, которую она обнуляет, но даже так будет кратче, чем использовать конструкторы. А если нужно "обнулять" не нулями, то можно аналогично:
Код: plaintext
1.
2.
3.
4.
5.
const stStruct& ZeroStruct(const int a, const int b)
{
	static const stStruct zero_obj = {a, b};
	return zero_obj;
}
...
Рейтинг: 0 / 0
инициализация структуры
    #34993413
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik

1. Только для тех, где есть гарантия и используй. Кстати, в таких обычно и функций нет.

2. Одна крайнасть хороша, и другая хороша, а истина где-то посередине. Задачу можно решить разными способами, но для конкретного применения один способ более подходящий чем другой. Ты решил, что я против мемсета? Интересно где это я написал, вроде бы пишу обратное. ;) Еще к вопросу с большим количеством свойств можно добавить, что зачастую тут имеют место для жизни вложенные структуры, далее - иерархии наследования, далее - аналогичные данные - аналогичные структруры.

3. Ну, почему бы нет. Статическая зерроинициализация - тоже один из вариантов реализации, следовательно и он имеет право на жизнь.
Кстати, опять же вопрос - а не отменят ее в будущем? Сомневаюсь, конечно, но могут придумать какой-нибудь спецификатор - zero, и если его не указать, то будет мусор. Врядли, конечно, - не такая уж она и напряжная.

"К людям надо мягше, а на вопросы смотреть ширше". ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34993455
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
против memset() уже я сам стал :)
вряд ли отменят или сделают что-то, что создаст серьезные проблемы при компиляции уже имеющихся сырцов, скорее могут добавить что-то новое

думаю тема исчерпана, всем спасибо за участие)
...
Рейтинг: 0 / 0
инициализация структуры
    #34994281
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
инициализация структуры
    #34994397
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
struct info {
    int i;
    double d;
    float f;
};

info i;

memset(&i, sizeof(i),  0 );

против

i.i =  0 ;
i.d =  0 ;
i.f =  0 ;

...
Рейтинг: 0 / 0
инициализация структуры
    #34994452
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков wrote:

> Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну
> тогда протестируй:
Можно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз
войти/выйти в процедуру, или заполнить диапазон нулями одной
процедурой. Но мне почему-то лень этим заниматсья.
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34994461
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVМожно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз
войти/выйти в процедуру, или заполнить диапазон нулями одной
процедурой. Но мне почему-то лень этим заниматсья.

Не одной быстротой сыт код.

ЗЫ: по мотивам пословицы.
...
Рейтинг: 0 / 0
инициализация структуры
    #34994462
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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++.
...
Рейтинг: 0 / 0
инициализация структуры
    #34994474
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Ага, щаз. То есть, memset - это дармовая функция, по вашему?


не тестировал, но в случае с >при размере массива в несколько десятков миллионов элементов, думаю, все же будет выигрыш, т.к. в memset() для обнуления не нужно использовать косвенную адресацию для вызова эти конструкторов или нечто подобное, но тут мы остановились не на "каждоразовом" вызове пустого конструктора, а на побитовом копировании готового объекта, кажется есть разница?

ErV
Так что "замысел
момента" ты придумываешь :).

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

ErV
А правила будут
слишком статичными, тем более не для всех задач они подходят.

тоже верно, на любое правило есть исключение, если будет нужно очень, я нарушу их, поэтому предпочту называть их не правилами, а рекомендациями, применимыми в большем кол-ве случаев
...
Рейтинг: 0 / 0
инициализация структуры
    #34994502
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik Анатолий Широков
Ага, щаз. То есть, memset - это дармовая функция, по вашему?


не тестировал, но в случае с >при размере массива в несколько десятков миллионов элементов, думаю, все же будет выигрыш, т.к. в memset() для обнуления не нужно использовать косвенную адресацию для вызова эти конструкторов или нечто подобное, но тут мы остановились не на "каждоразовом" вызове пустого конструктора, а на побитовом копировании готового объекта, кажется есть разница?



Как я понял автора, мы не сравниваем вызов memset для всех 100000 элементов, а сравнимаем что лучше:

zero-инициализация средствами компилятора

против

memset для тойже структуры, то memset явно проигрывает.

Если речь идет о занулении массива из 1000000 POD объектов средствами memset, то memset, конечно, "рулит".
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]