Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
p519446 Гость
|
Добавлено: Ср Окт 01 2003 04:45 Заголовок сообщения: Как убить "non-const function ... called to const object" |
|
|
Добрый , уважаемые знатоки! Есть задача создать MainMenu "на лету", в runtime. Вот фрагмент-пример кода (он РАБОТАЕТ, меню создает!):
const TMenuItem* xMenuLine[3]; xMenuLine[0]=NewItem("Column1", 0, false, true, Form1->OnCreate, 0, "xIDocMenu"); xMenuLine[1]=NewItem("Column2", 0, false, true, Form1->OnCreate, 0, "xODocMenu"); xMenuLine[2]=NewItem("Column3", 0, false, true, Form1->OnCreate, 0, "xPartMenu");
TMenuItem* xIDocItems[3]; xIDocItems[0]=NewItem("Col1_Line1", 0, false, true, Form1->OnCreate, 0, "xFNew"); xIDocItems[1]=NewItem("Col1_Line2", 0, false, true, Form1->OnCreate, 0, "xFOpen"); xIDocItems[2]=NewItem("Col1_Line3", 0, false, true, Form1->OnCreate, 0, "xFClose"); //TMenuItem* xp=xIDocItems[0]; xMenuLine[0]->Add(xIDocItems[0]);
....
Так вот, строка
xMenuLine[0]->Add(xIDocItems[0]);
и подобные ей сопровождаются предупреждениями компилятора: "W8037 Non-const function _fastcall TMenuItem::Add(TMenuItem *) called for const object" В хелпе сказано, что это ошибка, но она, дескать, "переведена в рязряд предупреждений, чтобы программы имели шанс запуститься" (вольный перевод автора ) Указанный фрагмент я взял, однако, из хелпа (с переделкой на TMainMenu с предлагаемого там TPopupMenu).
Что надо сделать, чтобы эти warning'и не вылезали ? Заранее спасибо всем, кто ответит! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Ср Окт 01 2003 10:29 Заголовок сообщения: Re: Как убить "non-const function ... called to const object" |
|
|
Расскажу как это делалось в Watcom #pragma warning 289 9 289-номер ворнинга 9-степень его незначительности
В свойствах проекта искал ? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
p519446 Гость
|
Добавлено: Чт Окт 02 2003 16:21 Заголовок сообщения: Re: Как убить "non-const function ... called to const object" |
|
|
Искал, но там этого не нашел (использую Borland C++ Builder 6.0). в help'e нашел только, что можно заблокировать вывод этих предупреждений опцией КОМАНДНОЙ строки. Блин, я в среде работаю, а они мне предлагают в DOS-сессию выгружаться, что-и ?! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Ср Окт 08 2003 11:13 Заголовок сообщения: шестого нет, но легко нашёл в пятом билдере |
|
|
Во-первых, обязательно объявлять TMenuItem* как const ?
Если обязательно, то иди в Projects->Options->Compiler, в группе Warnings выбери Selected, нажми кнопку Warnings, найди в появившемся списке свой и сними галочку. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
p519446 Гость
|
Добавлено: Чт Окт 09 2003 07:11 Заголовок сообщения: Re: шестого нет, но легко нашёл в пятом билдере |
|
|
Все равно, непонятно: почему они (Borland'ы)дают пример, на который их же компилятор "фырчит" и считает это ошибкой. Ну, уберу я эту галочку, только мы-то оба (я и компилятор ) будем знать, что проблема НЕ решена, а просто на нее не реагируют ![Smile](images/smiles/icon_smile.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Чт Окт 09 2003 10:50 Заголовок сообщения: а почему, собственно, const ? |
|
|
Разве не будет работать если объявить не const TMenuItem* xMenuLine[3]; а TMenuItem* xMenuLine[3]; ?
Раз мы объявили константный объект, то вызов функции объявленной без const, т.е. функции к-рая может менять состояние этого объекта, а собственно она его и меняет, добавляет новый item, заставляет компилятор беспокоиться. Не понятно, зачем в таком случае объявлять объект как константный ?
Ещё подобная ситуация. Я люблю при считывании файла кусками определять конец файла следующим образом while( read_len = fread( buf, 1, buf_len, file ){ ... } Одновременно и знаем длину считанного куска, которая при последнем чтении может быть меньше buf_len, и цикл сам завершится если read_len нулевое. Компилятор говорит possibly incorrect assignment. Я этот ворнинг отключаю. Хотя в другом месте чисто случайно напишешь if( a=b ) вместо if( a==b ) и будешь долго искать ошибку.
Так что добро и зло понятия относительные |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
p519446 Гость
|
Добавлено: Чт Окт 09 2003 12:20 Заголовок сообщения: Re: а почему, собственно, const ? |
|
|
Дык ведь пробовал я передавать НЕ-константный объект - компилер говорит, что не может привести типы (can not cast....) - функция Add должна принимать, к сож., именно const-объект. Такие вот дела... ЗЫ. Пользуясь случаем, хочу поблагодарить тебя за ответы, спасибо! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|