| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > генерить ошибку компилятором, а не препроцессором? |
| Автор: victor79 11.7.2011, 13:28 |
| есть класс со множеством различных перегруженных конструкторов. И большой объем использования этого класса. Переделал параметры одного из конструкторов, и думал компилятор мне выдаст все места где он встречается, что бы подправить его вызовы. А он вместо этого все эти вызовы молча залинковал на другой конструктор. Мысль такая, объявить конструктор-заглушку с прежними параметрами, и туда какую-нибудь директиву, на которую компилятор будет ругаться при попытке скомилить этот вызов. Такое возможно как-нибудь? (директива #error срабатывает на препроцессоре, а не в компиляции - не подходит) |
| Автор: bsa 11.7.2011, 13:59 |
| victor79, сделай конструктор без тела. Тогда линкер начнет материться и будет указано, где происходят вызовы. |
| Автор: borisbn 11.7.2011, 18:33 |
эхх, а я тебе хотел посоветовать рефакторинг от студии с помидорами... ну, тогда и правда только компилятор/линковщик. Или есть нормальные среды с рефакторингом ? |
| Автор: Сыроежка 13.7.2011, 16:15 | ||
Помимо закоментирования тела конструктора, вы можете также сделать этот конструктор закрытым, если до этого он у вас вызывался явно. |
| Автор: victor79 13.7.2011, 19:58 | ||
с тем кодом я уже разобрался, еще следуя первому совету - если есть хотя бы контроль, о присутствии ошибок, то их уже все поотыскивать гораздо проще. И на текущий момент это вопрос уже больше теоретический - как легче создавать надежный код. С вариантом private не везде пройдет - в вызовах внутри самого класса не получится. Но в остальных случаях этот вариант лучше - показывается позиция ошибки. |
| Автор: baldina 13.7.2011, 21:36 | ||
если бы тот "другой конструктор" был explicit, возникла бы ошибка компиляции. вероятно, в классе со множеством конструкторов, допустимо большинство из них объявить explicit |
| Автор: Earnest 14.7.2011, 06:47 |
| explicit имеет смысл только для конструкторов с одним аргументом - чтобы не применять этот конструктор как неявный оператор приведения. А у автора скорее всего сработало приведение типов аргументов. Просто не надо плодить лишних конструкторов, особенно таких, которые делают разные вещи, но имеют неявно приводимые типы аргументов. И вообще в дизайне программ/классов нужно придерживаться минимализма. |
| Автор: borisbn 14.7.2011, 08:21 | ||||||||
подписываюсь
а вот с этим не соглашусь (как-то уже говорили об этом) Если всё грамотно продумано, то чем мешает определение нескольких "сладких" функций в h-нике класса ? Почему, например, было бы плохо, если бы у std::string были бы функции
или
ведь у каждого есть свой велосипед-обёртка над sprintf'ом или stringstream'ом для этого... Почему Вас не смущает std::string::find_last_not_of, а смущает, если бы в векторе была бы сортировка ? И чем Вам не нравится, например, http://doc.qt.nokia.com/latest/qstring.html ? Не хочешь - не используй... Конечно можно и до маразма довести - конструктор класса строка, вычитывающий строку из файла, класс IPAddress, умеющий пинговать указанный ip-шник и т.п. |
| Автор: azesmcar 14.7.2011, 08:27 | ||
Ничем, но эти сладкие функции не должны быть частью класса. А кто сказал, что функция find_last_not_of в std::string это произведение искусства? std::string вообще хороший пример того, как не надо проектировать классы пиши "сладкие" функции в отдельном файле в виде свободных функций, кому надо тот включит. |
| Автор: mes 14.7.2011, 08:28 |
не подскажете где говорилось то ? это как то напрямую связанно с тем, о чем говорила Earnest ?! |
| Автор: boostcoder 14.7.2011, 08:30 | ||||
потому что это не строки забота. строка должна предоставлять два итератора(на начало, и на конец). ИМХО. учились по документации Qt? оно и видно. сплошные blob`ы потому что blob! не использую.
от троллей это вполне ожидаемо |
| Автор: mes 14.7.2011, 08:31 |
как класс библиотеки с определенными ограниченными требованиями стерпеть можно, тем более не самый плохой из ее классов.. |
| Автор: azesmcar 14.7.2011, 08:31 | ||
а где предел и как его определить? |
| Автор: boostcoder 14.7.2011, 08:31 | ||
ну можно позволить еще и length(). хотя для этого есть std::distance(). |
| Автор: borisbn 14.7.2011, 08:53 |
http://forum.vingrad.ru/forum/topic-326951/kw-ения-стандарт.html#st_0_view_0 нет. учились по boost ? оно и видно. сплошной минимализм |
| Автор: azesmcar 14.7.2011, 09:01 |
а что в этом плохого? |
| Автор: borisbn 14.7.2011, 09:23 |
а я и не говорил, что плохо. просто передразнивал boostcoder, а если серьёзно, то учился как, наверное, все (ну или многие): basic, pascal, asm, C, C++ & STL, VCL & Builder (как вспомню так вздрогну), Qt. Щаз хочу до-диез освоить. |
| Автор: mes 14.7.2011, 09:25 | ||||
я так понимаю, выводы из темы по ссылке были сделаны потому, что никто не возразил высказанному там.. терь хоть понятно откуда ветер дует, сами придумали, сами поверили |
| Автор: boostcoder 14.7.2011, 09:26 | ||
у меня так получилось: basic, asm, C, C++. еще Python нравится. кое-что пописываю на нем. а вообще, считаю что лучше знать что-то одно. но знать хорошо! мой выбор с++. Добавлено через 40 секунд удобно. |
| Автор: borisbn 14.7.2011, 09:33 | ||||
возразили и ещё как. причём с некоторыми аспектами я вполне согласен. не понимаю, откуда такой вывод. Вы меня, наверное, с кем-то путаете (на "С" начинается, на "жка" заканчивается) во! забыл. тоже хочу посмотреть в эту сторону. Добавлено через 11 минут и 54 секунды
Лучше, конечно, знать много и хорошо, но это - утопия. Но и далеко не всё можно эффективно решить с помощью Си++. В вебе, например, многое успешно решается на пхп и т.п. На мобильных платформах (в частности на андроиде) - Java. Да и знание других языков развивает (так же как иностранных в повседневной жизни). |
| Автор: mes 14.7.2011, 10:28 |
просто привели в поддержку высказывания тему, в которой никто и не поддерживал подобных взглядов.. то что стандартных преобразований не хватает, это да.. но чтоб пихать в стринг, когда там и так лишнего полно, это лишь связываний рук в дальнейшем.. но это уже жуткий оффтоп, так что пора прекращать |
| Автор: borisbn 14.7.2011, 10:30 |
поддерживаю. стоп флуд-машина! |
| Автор: Earnest 14.7.2011, 13:01 |
| Во, наговорили-то Да вроде как уже определили. Например, Макконнелл, Совершенный код, ну и другие авторы. Ну там "один класс - одна задача", "согласованный уровень абстракции" и т.д. Принципов немного, наизусть их формулировки не помню, а сама называю немного по-другому. Что касается примера со строкой, строка - это специализированный контейнер. Вот только соответствующие функции и должна содержать. Остальное - отдельно. Собственно, все (авторы книг по программированию, которые я читала) давно с этим согласны - что std::string перегружена (а также почти все реализации других строк в других библиотеках). Но так уж выросло. Из соображений дизайна менять устоявшиеся и широко используемые интерфейсы - самоубийство (для библиотеки). Но в теме речь идет о своем коде. |
| Автор: kamre 14.7.2011, 13:03 | ||
А что Visual Assit уже научился искать references для конструкторов? Это никогда не работало в нем, насколько я помню. |
| Автор: borisbn 14.7.2011, 13:12 |
| kamre, мдааа. действительно. не ищет. (где тут иконка с посыпанием головы пеплом?) |
| Автор: kamre 14.7.2011, 14:17 | ||
Eclipse CDT умеет искать references для конструкторов: ![]() |
| Автор: Сыроежка 14.7.2011, 18:28 | ||
Вектор имеет итератор произвольного доступа, поэтому никакого смысла для него отдельно писать сортировку не имеет смысла. Она уже написана в виде стандартного алгоритма std::sort. Это все равно, что для каждого массива писать отдельную функцию сортировки. Что касается функции-члена класса std::string find_last_not_of, то ситуация здесь другая. Для класса string вы можете написать оптимальную такую функцию, так как в основе класса лежат обычные строки в формате С. То есть вы можете оптимизировать эту функцию по сравнению с аналогичным алгоритмом, если бы вы писали его для всех контейнеров. |
| Автор: Earnest 14.7.2011, 18:49 | ||
Напиши ее, но вне класса, кто мешает? Не хватает доступа? Можно сделать френдом. Но класс-то зачем засирать до полной нечитабельности? Я в таких случаях (чтобы не плодить много френдов) обычно создаю еще один класс, утилитный, со всякими алгоритмами по обработке основного класса. |