Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > генерить ошибку компилятором, а не препроцессором?


Автор: victor79 11.7.2011, 13:28
есть класс со множеством различных перегруженных конструкторов. И большой объем использования этого класса. Переделал параметры одного из конструкторов, и думал компилятор мне выдаст все места где он встречается, что бы подправить его вызовы. А он вместо этого все эти вызовы молча залинковал на другой конструктор.

Мысль такая, объявить конструктор-заглушку с прежними параметрами, и туда какую-нибудь директиву, на которую компилятор будет ругаться при попытке скомилить этот вызов. Такое возможно как-нибудь?

(директива #error срабатывает на препроцессоре, а не в компиляции - не подходит)

Автор: bsa 11.7.2011, 13:59
victor79, сделай конструктор без тела. Тогда линкер начнет материться и будет указано, где происходят вызовы.

Автор: victor79 11.7.2011, 14:25
Цитата(bsa @  11.7.2011,  13:59 Найти цитируемый пост)
victor79, сделай конструктор без тела. Тогда линкер начнет материться и будет указано, где происходят вызовы. 


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

забыл сообщить, компилятор mingw4.4

Автор: borisbn 11.7.2011, 18:33
Цитата(victor79 @  11.7.2011,  14:25 Найти цитируемый пост)
забыл сообщить, компилятор mingw4.4

эхх, а я тебе хотел посоветовать рефакторинг от студии с помидорами... ну, тогда и правда только компилятор/линковщик. Или есть нормальные среды с рефакторингом ?

Автор: Сыроежка 13.7.2011, 16:15
Цитата(victor79 @  11.7.2011,  13:28 Найти цитируемый пост)
есть класс со множеством различных перегруженных конструкторов. И большой объем использования этого класса. Переделал параметры одного из конструкторов, и думал компилятор мне выдаст все места где он встречается, что бы подправить его вызовы. А он вместо этого все эти вызовы молча залинковал на другой конструктор.

Мысль такая, объявить конструктор-заглушку с прежними параметрами, и туда какую-нибудь директиву, на которую компилятор будет ругаться при попытке скомилить этот вызов. Такое возможно как-нибудь?

(директива #error срабатывает на препроцессоре, а не в компиляции - не подходит) 


Помимо закоментирования тела конструктора, вы можете также сделать этот конструктор закрытым, если до этого он у вас вызывался явно.

Автор: victor79 13.7.2011, 19:58
Цитата(Сыроежка @  13.7.2011,  16:15 Найти цитируемый пост)
Помимо закоментирования тела конструктора, вы можете также сделать этот конструктор закрытым, если до этого он у вас вызывался явно


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

С вариантом private не везде пройдет - в вызовах внутри самого класса не получится. Но в остальных случаях этот вариант лучше - показывается позиция ошибки.

Автор: baldina 13.7.2011, 21:36
Цитата(victor79 @  11.7.2011,  13:28 Найти цитируемый пост)
А он вместо этого все эти вызовы молча залинковал на другой конструктор.

если бы тот "другой конструктор" был explicit, возникла бы ошибка компиляции.
вероятно, в классе со множеством конструкторов, допустимо большинство из них объявить explicit

Автор: Earnest 14.7.2011, 06:47
explicit имеет смысл только для конструкторов с одним аргументом - чтобы не применять этот конструктор как неявный оператор приведения. А у автора скорее всего сработало приведение типов аргументов. Просто не надо плодить лишних конструкторов, особенно таких, которые делают разные вещи, но имеют неявно приводимые типы аргументов.
И вообще в дизайне программ/классов нужно придерживаться минимализма.

Автор: borisbn 14.7.2011, 08:21
Цитата(Earnest @  14.7.2011,  06:47 Найти цитируемый пост)
Просто не надо плодить лишних конструкторов, особенно таких, которые делают разные вещи, но имеют неявно приводимые типы аргументов.

подписываюсь
Цитата(Earnest @  14.7.2011,  06:47 Найти цитируемый пост)
И вообще в дизайне программ/классов нужно придерживаться минимализма.

а вот с этим не соглашусь (как-то уже говорили об этом)
Если всё грамотно продумано, то чем мешает определение нескольких "сладких" функций в h-нике класса ? Почему, например, было бы плохо, если бы у std::string были бы функции
Код
int toInt( bool * ok );

или
Код
static std::string fromInt( int val, int base = 10, int width = 0, char fill = '0' );

ведь у каждого есть свой велосипед-обёртка над sprintf'ом или stringstream'ом для этого...

Почему Вас не смущает std::string::find_last_not_of, а смущает, если бы в векторе была бы сортировка ?

И чем Вам не нравится, например, http://doc.qt.nokia.com/latest/qstring.html ? Не хочешь - не используй...
Конечно можно и до маразма довести - конструктор класса строка, вычитывающий строку из файла, класс IPAddress, умеющий пинговать указанный ip-шник и т.п.

Автор: azesmcar 14.7.2011, 08:27
Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
Если всё грамотно продумано, то чем мешает определение нескольких "сладких" функций в h-нике класса ? Почему, например, было бы плохо, если бы у std::string были бы функции

Ничем, но эти сладкие функции не должны быть частью класса.

Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
Почему Вас не смущает std::string::find_last_not_of

А кто сказал, что функция find_last_not_of в std::string это произведение искусства? std::string вообще хороший пример того, как не надо проектировать классы smile 

пиши "сладкие" функции в отдельном файле в виде свободных функций, кому надо тот включит.

Автор: mes 14.7.2011, 08:28
Цитата(borisbn @  14.7.2011,  07:21 Найти цитируемый пост)
а вот с этим не соглашусь (как-то уже говорили об этом)

не подскажете где говорилось то ?


Цитата(borisbn @  14.7.2011,  07:21 Найти цитируемый пост)
 если бы у std::string были бы функции

это как то напрямую связанно с тем, о чем говорила  Earnest ?!  smile 


Автор: boostcoder 14.7.2011, 08:30
Цитата

у std::string были бы функции
int toInt( bool * ok );
static std::string fromInt( int val, int base = 10, int width = 0, char fill = '0' );

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

Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
а смущает, если бы в векторе была бы сортировка ?

учились по документации Qt? оно и видно. сплошные blob`ы smile 

Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
И чем Вам не нравится, например, такое ?

потому что blob!

Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
Не хочешь - не используй

не использую.

Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
можно и до маразма довести - конструктор класса строка, вычитывающий строку из файла, класс IPAddress, умеющий пинговать указанный ip-шник и т.п.

от троллей это вполне ожидаемо smile 

Автор: mes 14.7.2011, 08:31
Цитата(borisbn @  14.7.2011,  07:21 Найти цитируемый пост)
И чем Вам не нравится, например, такое ?

как класс библиотеки с определенными ограниченными требованиями стерпеть можно, тем более не самый плохой из ее классов..  smile 

Автор: azesmcar 14.7.2011, 08:31
Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
Конечно можно и до маразма довести - конструктор класса строка, вычитывающий строку из файла, класс IPAddress, умеющий пинговать указанный ip-шник и т.п. 

а где предел и как его определить?

Автор: boostcoder 14.7.2011, 08:31
Цитата(boostcoder @  14.7.2011,  08:30 Найти цитируемый пост)
строка должна предоставлять два итератора(на начало, и на конец). ИМХО.

ну можно позволить еще и length().
хотя для этого есть std::distance().

Автор: borisbn 14.7.2011, 08:53
Цитата(mes @  14.7.2011,  08:28 Найти цитируемый пост)
не подскажете где говорилось то ?

http://forum.vingrad.ru/forum/topic-326951/kw-ения-стандарт.html#st_0_view_0
Цитата(boostcoder @  14.7.2011,  08:30 Найти цитируемый пост)
учились по документации Qt? оно и видно. сплошные blob`ы

нет.
учились по boost ? оно и видно. сплошной минимализм smile

Автор: azesmcar 14.7.2011, 09:01
Цитата(borisbn @  14.7.2011,  08:53 Найти цитируемый пост)
учились по boost ? оно и видно. сплошной минимализм smile

а что в этом плохого? smile 

Автор: borisbn 14.7.2011, 09:23
Цитата(azesmcar @  14.7.2011,  09:01 Найти цитируемый пост)
а что в этом плохого?

а я и не говорил, что плохо. просто передразнивал smile

boostcoder, а если серьёзно, то учился как, наверное, все (ну или многие): basic, pascal, asm, C, C++ & STL, VCL & Builder (как вспомню так вздрогну), Qt. Щаз хочу до-диез освоить.

Автор: mes 14.7.2011, 09:25
Цитата(borisbn @  14.7.2011,  07:21 Найти цитируемый пост)

Цитата(Earnest @  14.7.2011,  05:47 Найти цитируемый пост)
И вообще в дизайне программ/классов нужно придерживаться минимализма. 
а вот с этим не соглашусь (как-то уже говорили об этом)

http://forum.vingrad.ru/forum/topic-326951...tml#st_0_view_0

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

Автор: boostcoder 14.7.2011, 09:26
Цитата(borisbn @  14.7.2011,  09:23 Найти цитируемый пост)
а если серьёзно, то учился как, наверное, все (ну или многие): basic, pascal, asm, C, C++ & STL, VCL & Builder (как вспомню так вздрогну), Qt.

у меня так получилось: basic, asm, C, C++. еще Python нравится. кое-что пописываю на нем.
а вообще, считаю что лучше знать что-то одно. но знать хорошо! мой выбор с++.

Добавлено через 40 секунд
Цитата(mes @  14.7.2011,  09:25 Найти цитируемый пост)
сами придумали, сами поверили

удобно.

Автор: borisbn 14.7.2011, 09:33
Цитата(mes @  14.7.2011,  09:25 Найти цитируемый пост)
выводы из темы по ссылке были сделаны потому, что никто не возразил высказанному там..

возразили и ещё как. причём с некоторыми аспектами я вполне согласен.
Цитата(mes @  14.7.2011,  09:25 Найти цитируемый пост)
терь хоть понятно откуда ветер дует, сами придумали, сами поверили

не понимаю, откуда такой вывод. Вы меня, наверное, с кем-то путаете (на "С" начинается, на "жка" заканчивается) smile

Цитата(boostcoder @  14.7.2011,  09:26 Найти цитируемый пост)
еще Python нравится. кое-что пописываю на нем.

во! забыл. тоже хочу посмотреть в эту сторону.

Добавлено через 11 минут и 54 секунды
Цитата(boostcoder @  14.7.2011,  09:26 Найти цитируемый пост)
а вообще, считаю что лучше знать что-то одно. но знать хорошо!

Лучше, конечно, знать много и хорошо, но это - утопия. Но и далеко не всё можно эффективно решить с помощью Си++. В вебе, например, многое успешно решается на пхп и т.п. На мобильных платформах (в частности на андроиде) - Java.

Да и знание других языков развивает (так же как иностранных в повседневной жизни).

Автор: mes 14.7.2011, 10:28
Цитата(borisbn @  14.7.2011,  08:33 Найти цитируемый пост)
не понимаю, откуда такой вывод.

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



Автор: borisbn 14.7.2011, 10:30
Цитата(mes @  14.7.2011,  10:28 Найти цитируемый пост)
но это уже жуткий оффтоп, так что пора прекращать

поддерживаю. стоп флуд-машина! smile

Автор: Earnest 14.7.2011, 13:01
Во, наговорили-то smile 
Цитата(azesmcar @  14.7.2011,  09:31 Найти цитируемый пост)
а где предел и как его определить? 

Да вроде как уже определили. Например, Макконнелл, Совершенный код, ну и другие авторы. Ну там "один класс - одна задача", "согласованный уровень абстракции" и т.д. Принципов немного, наизусть их формулировки не помню, а сама называю немного по-другому. Что касается примера со строкой, строка - это специализированный контейнер. Вот только соответствующие функции и должна содержать. Остальное - отдельно. Собственно, все (авторы книг по программированию, которые я читала) давно с этим согласны - что std::string перегружена (а также почти все реализации других строк в других библиотеках). Но так уж выросло. Из соображений дизайна менять устоявшиеся и широко используемые интерфейсы - самоубийство (для библиотеки). Но в теме речь идет о своем коде. 

Автор: kamre 14.7.2011, 13:03
Цитата(borisbn @ 11.7.2011,  18:33)
эхх, а я тебе хотел посоветовать рефакторинг от студии с помидорами...

А что Visual Assit уже научился искать references для конструкторов? Это никогда не работало в нем, насколько я помню.

Автор: borisbn 14.7.2011, 13:12
kamre, мдааа. действительно. не ищет. (где тут иконка с посыпанием головы пеплом?)

Автор: kamre 14.7.2011, 14:17
Цитата(borisbn @ 14.7.2011,  13:12)
действительно. не ищет.

Eclipse CDT умеет искать references для конструкторов:
user posted image


Автор: Сыроежка 14.7.2011, 18:28
Цитата(borisbn @  14.7.2011,  08:21 Найти цитируемый пост)
Почему Вас не смущает std::string::find_last_not_of, а смущает, если бы в векторе была бы сортировка ?


Вектор имеет итератор произвольного доступа, поэтому никакого смысла для него отдельно писать сортировку не имеет смысла. Она уже написана в виде стандартного алгоритма std::sort.  Это все равно, что для каждого массива писать отдельную функцию сортировки.

Что касается функции-члена класса std::string find_last_not_of, то ситуация здесь другая. Для класса string вы можете написать оптимальную такую функцию, так как в основе класса лежат обычные строки в формате С. То есть вы можете оптимизировать эту функцию по сравнению с аналогичным алгоритмом, если бы вы писали его  для всех контейнеров.

Автор: Earnest 14.7.2011, 18:49
Цитата(Сыроежка @  14.7.2011,  19:28 Найти цитируемый пост)
Что касается функции-члена класса std::string find_last_not_of, то ситуация здесь другая. Для класса string вы можете написать оптимальную такую функцию

Напиши ее, но вне класса, кто мешает? Не хватает доступа? Можно сделать френдом. Но класс-то зачем засирать до полной нечитабельности?
Я в таких случаях (чтобы не плодить много френдов) обычно создаю еще один класс, утилитный,  со всякими алгоритмами по обработке основного класса.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)