Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> генерить ошибку компилятором, а не препроцессором? 
:(
    Опции темы
victor79
Дата 11.7.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



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

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

(директива #error срабатывает на препроцессоре, а не в компиляции - не подходит)
PM MAIL WWW   Вверх
bsa
Дата 11.7.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



victor79, сделай конструктор без тела. Тогда линкер начнет материться и будет указано, где происходят вызовы.
PM   Вверх
victor79
Дата 11.7.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



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


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

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

PM MAIL WWW   Вверх
borisbn
Дата 11.7.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Сыроежка
Дата 13.7.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: нет
Всего: 1



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

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

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


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

PM MAIL   Вверх
victor79
Дата 13.7.2011, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



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


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

С вариантом private не везде пройдет - в вызовах внутри самого класса не получится. Но в остальных случаях этот вариант лучше - показывается позиция ошибки.
PM MAIL WWW   Вверх
baldina
Дата 13.7.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



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

если бы тот "другой конструктор" был explicit, возникла бы ошибка компиляции.
вероятно, в классе со множеством конструкторов, допустимо большинство из них объявить explicit
PM MAIL   Вверх
Earnest
Дата 14.7.2011, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
borisbn
Дата 14.7.2011, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(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, а смущает, если бы в векторе была бы сортировка ?

И чем Вам не нравится, например, такое ? Не хочешь - не используй...
Конечно можно и до маразма довести - конструктор класса строка, вычитывающий строку из файла, класс IPAddress, умеющий пинговать указанный ip-шник и т.п.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 14.7.2011, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(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 

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

Это сообщение отредактировал(а) azesmcar - 14.7.2011, 08:28
PM   Вверх
mes
Дата 14.7.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


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

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




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 14.7.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата

у 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 
PM WWW   Вверх
mes
Дата 14.7.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 14.7.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

а где предел и как его определить?
PM   Вверх
boostcoder
Дата 14.7.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

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

Это сообщение отредактировал(а) boostcoder - 14.7.2011, 08:41
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.