инициализация структур
От: MASReady  
Дата: 20.12.13 07:11
Оценка:
Доброго времени суток.
Имеем обычные структуры:
struct s1{
 int  ci;
 char cc[12];
 long cl;
} e1;

struct s2{
 int  ci;
 long cl;
} e2;


инициализировать их нужно позже,
такой вариант не прокатывает:

e1={1,"qqq",2};
e2={1,2};

//ошибки:
//замечание: candidate is main()::s1& main()::s1::operator=(const main()::s1&)
//замечание: candidate is main()::s2& main()::s2::operator=(const main()::s2&)
//ошибка: no match for 'operator=' in 'e1={1,"qqq",2}'
//ошибка: no match for 'operator=' in 'e2={1,2}'

а такой хавает, все корректно присваивается:

e1=(s1){1,"qqq",2};
e2=(s2){1,2};


правильный ли это вариант, или можно/нужно инициализировать как-то по другому?

причем иногда когда присваивание первой структуры пишешь 2-м вариантом, то присваивание остальных можно оставить и первым вариантом, почему-то перестает ругаться и все корректно присваивает

инфу в нете почитал, на форуме поискал — много всего, но толком не нашел
Re: инициализация структур
От: skeptic  
Дата: 20.12.13 07:27
Оценка:
Здравствуйте, MASReady, Вы писали:


А в чём вопрос?
У тебя здесь не инициализация, у тебя присваивание. А соответствующего оператора не определено, вот и не компилируется.
Во втором варианте ты создаёшь временный объект структуры, инициализируешь его, и присваиваешь его при помощи оператора сгенерированного компилятором.
Правильно это или нет решать тебе, зависит от того какую логику ты закладываешь в класс.
Re[2]: инициализация структур
От: MASReady  
Дата: 20.12.13 07:34
Оценка:
Здравствуйте, skeptic, Вы писали:

S>Здравствуйте, MASReady, Вы писали:



S>А в чём вопрос?

S>У тебя здесь не инициализация, у тебя присваивание. А соответствующего оператора не определено, вот и не компилируется.
S>Во втором варианте ты создаёшь временный объект структуры, инициализируешь его, и присваиваешь его при помощи оператора сгенерированного компилятором.
S>Правильно это или нет решать тебе, зависит от того какую логику ты закладываешь в класс.

Я немного неточно выразился, это именно присваивание, но сразу всех полей.
Я только не пойму почему иногда когда присваивание первой структуры пишешь 2-м вариантом, то присваивание остальных можно оставить и первым вариантом, почему-то перестает ругаться и все корректно присваивает?
Re[3]: инициализация структур
От: skeptic  
Дата: 20.12.13 07:45
Оценка:
Здравствуйте, MASReady, Вы писали:

MAS>Здравствуйте, skeptic, Вы писали:


S>>Здравствуйте, MASReady, Вы писали:



S>>А в чём вопрос?

S>>У тебя здесь не инициализация, у тебя присваивание. А соответствующего оператора не определено, вот и не компилируется.
S>>Во втором варианте ты создаёшь временный объект структуры, инициализируешь его, и присваиваешь его при помощи оператора сгенерированного компилятором.
S>>Правильно это или нет решать тебе, зависит от того какую логику ты закладываешь в класс.

MAS>Я немного неточно выразился, это именно присваивание, но сразу всех полей.

MAS>Я только не пойму почему иногда когда присваивание первой структуры пишешь 2-м вариантом, то присваивание остальных можно оставить и первым вариантом, почему-то перестает ругаться и все корректно присваивает?

Это происходит потому что у тебя s1 не является POD.
Попробуй заменить char cc[12] на char* cc
Re[4]: инициализация структур
От: MASReady  
Дата: 20.12.13 07:56
Оценка:
Здравствуйте, skeptic, Вы писали:

S>Здравствуйте, MASReady, Вы писали:


MAS>>Здравствуйте, skeptic, Вы писали:


S>>>Здравствуйте, MASReady, Вы писали:



S>>>А в чём вопрос?

S>>>У тебя здесь не инициализация, у тебя присваивание. А соответствующего оператора не определено, вот и не компилируется.
S>>>Во втором варианте ты создаёшь временный объект структуры, инициализируешь его, и присваиваешь его при помощи оператора сгенерированного компилятором.
S>>>Правильно это или нет решать тебе, зависит от того какую логику ты закладываешь в класс.

MAS>>Я немного неточно выразился, это именно присваивание, но сразу всех полей.

MAS>>Я только не пойму почему иногда когда присваивание первой структуры пишешь 2-м вариантом, то присваивание остальных можно оставить и первым вариантом, почему-то перестает ругаться и все корректно присваивает?

S>Это происходит потому что у тебя s1 не является POD.

S>Попробуй заменить char cc[12] на char* cc

Спасибо, я как-то так и думал, но сомневался
Re: инициализация структур
От: NeoCode  
Дата: 20.12.13 12:14
Оценка: +1
Здравствуйте, MASReady, Вы писали:

MAS>а такой хавает, все корректно присваивается:


MAS>
MAS>e1=(s1){1,"qqq",2};
MAS>e2=(s2){1,2};
MAS>


Visusl Studio 2010, у меня на такой вариант тоже ругается. А я уж было обрадовался, что так можно...
Re[2]: инициализация структур
От: skeptic  
Дата: 20.12.13 14:01
Оценка:
Здравствуйте, NeoCode, Вы писали:

NC>Здравствуйте, MASReady, Вы писали:


MAS>>а такой хавает, все корректно присваивается:


MAS>>
MAS>>e1=(s1){1,"qqq",2};
MAS>>e2=(s2){1,2};
MAS>>


NC>Visusl Studio 2010, у меня на такой вариант тоже ругается. А я уж было обрадовался, что так можно...


Ну так 2010 студия не держит initializer list, вот оно и не коньпелируется
Re: инициализация структур
От: visual_wind  
Дата: 20.12.13 14:24
Оценка:
Здравствуйте, MASReady, Вы писали:

MAS>Доброго времени суток.

MAS>Имеем обычные структуры:
MAS>
MAS>struct s1{
MAS> int  ci;
MAS> char cc[12];
MAS> long cl;
MAS>} e1;

MAS>struct s2{
MAS> int  ci;
MAS> long cl;
MAS>} e2;
MAS>


MAS>инициализировать их нужно позже,


В С++11, похоже, это можно сделать достаточно просто — подробный ответ здесь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.