AG>Имена паблик полей совпадают с именами параметров конструктора.
AG>Должно ли это компилироваться? AG>Стоит ли это использовать? AG>Что и как следует перименовать, если не стоит оставлять так? AG>(паблик поля тут все, кроме конструкторов методов не предвидится, инкапсулировать нечего)
Никаких проблем с этим нет и такая инициализация полностью well-formed. При вычислении выражений в круглых скобках используемые имена, естественно, ищутся в первую очередь в текущей области видимости, т.е. среди параметров конструктора, затем в области видимости и класса, затем в обрамляющем пространстве имен и т.д. — так же точно как и у обычных функций. Имена же инициализируемых членов ищутся исключительно в области видимости класса, что тоже вполне логично, поэтому конфликта не происходит.
--
Re: Список инициализации: имена полей и параметров совпадают
Здравствуйте, Alexander G, Вы писали:
AG>Стоит ли это использовать?
я бы не советовал. Обычная реакция среднего C++ программиста на такой код это лёгкий ступор. После этого могут возникнуть вопросы.
А если можно как то избавиться от лишних вопросов, то лучше от них избавляться.
Re[3]: Список инициализации: имена полей и параметров совпад
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>>В мелких классах можно, в крупных — под вопросом, и кроме того, может быть запрещено стандартами кодирования (должен быть префикс или иное выделение).
AG>В классах — таки да, запрещено, но какой же это класс? Просто структура, у которой есть конструкторы для удобства.
Это уже терминологическая проблема.
ЮЖ>>PS: невозможно допустить copy-paste ошибку такого вида:
ЮЖ>>
AG>Имена паблик полей совпадают с именами параметров конструктора.
AG>Должно ли это компилироваться? AG>Стоит ли это использовать? AG>Что и как следует перименовать, если не стоит оставлять так? AG>(паблик поля тут все, кроме конструкторов методов не предвидится, инкапсулировать нечего)
Имена паблик полей совпадают с именами параметров конструктора.
Должно ли это компилироваться?
Стоит ли это использовать?
Что и как следует перименовать, если не стоит оставлять так?
(паблик поля тут все, кроме конструкторов методов не предвидится, инкапсулировать нечего)
Русский военный корабль идёт ко дну!
Re[2]: Список инициализации: имена полей и параметров совпад
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>В мелких классах можно, в крупных — под вопросом, и кроме того, может быть запрещено стандартами кодирования (должен быть префикс или иное выделение).
В классах — таки да, запрещено, но какой же это класс? Просто структура, у которой есть конструкторы для удобства.
ЮЖ>PS: невозможно допустить copy-paste ошибку такого вида:
ЮЖ>
Здравствуйте, Alexander G, Вы писали:
AG>Имена паблик полей совпадают с именами параметров конструктора. AG>Должно ли это компилироваться? AG>Стоит ли это использовать?
Работать-то будет и для конструкторов не такая уж плохая практика, а вот в обычных функцях…
struct some {
string s;
some(string s)
:s(s) // ok
{}
void set(string s) {
this->s = s; // … можно легко забыть о необходимости this…
}
};
… особенно, если там не тривиальное присваивание, а и дополнительные проверки/вызовы.
Re: Список инициализации: имена полей и параметров совпадают
AF>Нет, так нельзя, ожидается имя. По-крайней мере, мой gcc 4.4.1 (да и MS VC++ 2008, Express) говорят так а в стандарте что-то не нахожу
гм.... мне всегда казалось, что так можно, был убежден. Вот решил проверить — таки не собрается
это потому что this известен только в пределах {} ?
По крайней мере мне это говорит о том, что я никогда так не делал, оказывается — таки всегда старался избегать таких совпадений.
А раньше, в прежних версиях студиев, это работало, никто не помнит?
Re[4]: Список инициализации: имена полей и параметров совпад
Здравствуйте, fuyant, Вы писали:
F>это потому что this известен только в пределах {} ?
Там просто ожидается имя члена класса или предка, без выражений, this и т.п.
F>По крайней мере мне это говорит о том, что я никогда так не делал, оказывается — таки всегда старался избегать таких совпадений.
Я иногда так делаю для структур: на описанный в ветке возможный глюк с
// Было:
Class ( int name ) : name ( name ) ...
// Стало:
Class ( int somethingOtherName ) : name ( name ) ...
пока не натыкался, но это не значит, что когда-нибудь не наткнусь
Максимум, что может спасти с таким наименованием от нескольких часов "счастливой отладки" ( ) — это warning о неиспользуемой переменной. Если, конечно, в конструкторе она действительно нигде больше не используется.
Есть ещё -Winit-self для GCC, но достаточно долгое время он был отломан для C++ (у меня что-то не получается его и сейчас заставить работать) и навряд ли спасёт от инициализирования члена класса самим собой.
F>А раньше, в прежних версиях студиев, это работало, никто не помнит?
Проверил только что под самой старой, которая есть под рукой — 6-й. Нет, такого нет.
Re[4]: Список инициализации: имена полей и параметров совпад
Здравствуйте, fuyant, Вы писали:
F>гм.... мне всегда казалось, что так можно, был убежден. Вот решил проверить — таки не собрается F>это потому что this известен только в пределах {} ? F>По крайней мере мне это говорит о том, что я никогда так не делал, оказывается — таки всегда старался избегать таких совпадений. F>А раньше, в прежних версиях студиев, это работало, никто не помнит?