|
8 / 8 / 1
Регистрация: 23.09.2011
Сообщений: 45
|
||||||||||||||||
Вызывается не тот конструктор15.03.2012, 15:13. Показов 1837. Ответов 11
Метки нет (Все метки)
Имеется класс, вот часть его объявления:
Проблема состоит в том, что при вызове функции init в блоке try-catch вызывается конструктор MQLCopir(const std::string &msg, bool fatal) вместо нужного. Вопроса два: почему вызывается не тот конструктор и как это исправить?
0
|
||||||||||||||||
| 15.03.2012, 15:13 | |
|
Ответы с готовыми решениями:
11
Вызывается не тот конструктор При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) |
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 15.03.2012, 15:53 | |
|
Даже если в классе есть конструктор MQLCopir(const char *, const char *), всё равно вызывается MQLCopir(const std::string&, bool)?
Если имеется ввиду, что вызывается "не тот" конструктор, когда в классе есть только два - MQLCopir(const std::string&, const std::string&) и MQLCopit(const std::string&, bool), то проблема в том, что при перегрузке пользовательские преобразование (а преобразование из const char * в std::string посредством её конструктора является именно пользовательским преобразованием) рассматриваются в последнюю очередь. Если мы прикинемся компилятором, то при вызове MQLCopir(const_char_ptr1, const_char_ptr2) можно расставить уровень "плохости" преобразований так (при этом 0 - преобразование не требуется, 1 - повышение, 2 - встроенное приведение, 3 - определённое пользователем приведение): MQLCopir(const std::string&, const std::string&): 3 3 MQLCopir(const std::string&, bool): 3 2 Понятно, что компилятор выберет второй вариант, потому что он лучше в отношении "плохости" преобразований.
0
|
|
|
8 / 8 / 1
Регистрация: 23.09.2011
Сообщений: 45
|
|
| 15.03.2012, 16:08 [ТС] | |
|
Даже при наличии конструктора MQLCopir(const char *, const char *) вызывается MQLCopir(const std::string&, bool). То, что компилятору легче сделать преобразование const char* в bool, чем в std::string, это я тоже догадывался, поэтому и добавил третий конструктор, в котором преобразовывать вообще ничего не надо.
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 15.03.2012, 16:13 | |
|
1. Пример кода, приводящего к такому вызову, привести можешь?
2. Какой компилятор?
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 15.03.2012, 16:16 | |
|
mdt::Vladimir, http://liveworkspace.org/code/... 94577c35a9
1
|
|
|
8 / 8 / 1
Регистрация: 23.09.2011
Сообщений: 45
|
|||||||||||
| 15.03.2012, 17:27 [ТС] | |||||||||||
|
Вообще этот код предназначен для работы на Windows, но разрабатывается и тестируется под Linux, т.к. это часть большого проекта для freeBSD, а это кусок клиентской части, компилятор - GCC 4.4.3.
Пример кода, при водящего к такому вызову:
test/test_cwrapper.cpp:19: error: Failure in cwrapper: !fatal_error(copir) 12-03-15 17:47:16 [FATAL] fatal error: test Недостающие функции:
CheshireCat, зачем про пример и компилятор-то спрашивал?
0
|
|||||||||||
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 15.03.2012, 17:48 | |
|
Я попытался воспроизвести твою проблему.... короче, у тебя в коде, судя по всему, зацикливание: функция init("test", "123") зовет конструктор MQLCopir, а тот, в свою очередь, зовет опять init().... да, и там еще разночтение: то init(const char*, const char*), то init(const char*, const char*, bool) - где правда? или в листинге отсутствует еще одна функция?
В общем, если попытаться "предположить, как оно должно работать" и добиться нормальной работы - но не факт, что правильно, т.к. телепатии я не обучен :-), то результат у меня ровно такой же, как и у коллеги silent_1991. Компиль GCC 4.7.0.
1
|
|
|
8 / 8 / 1
Регистрация: 23.09.2011
Сообщений: 45
|
||||||
| 15.03.2012, 20:03 [ТС] | ||||||
|
Аа, ну да... Я и не заметил, что там тоже init )) Это метод класса MQLCopir, т.е. там нет рекурсии. Я просто не целиком объявление класса выложил. На всякий случай, вот полностью:
Добавлено через 5 минут Может ли быть подобное из-за обращения по неверному указателю или из-за переполнения буфера где-нибудь в программе? Я знаю, что бывают невероятные глюки из-за такого, но обычно всё отваливается после этого, поэтому как-то такой вариант не рассматриваю, тем более, что тут просто тест и в нём мало что происходит, чтоб такие ошибки возникали. Добавлено через 27 минут Всё, разобрался... Я даже к конструктору MQLCopir(const std::string&, bool) добавил ещё третий параметр, чтобы уж точно он не мог быть вызван, НО каким-то фантастическим образом вызывался. В итоге обратил внимание, что исполняемый файл у меня позавчерашний (тот, что тест содержит), сам же тестируемый код собирается в библиотеку, которая имеет нормальную дату модификации. Короче проблема в том, что из-за чего-то не собирался этот бинарник, но библиотека собиралась, ну и как-то этот тест вызывал другой конструктор. Вот такая бредовая ситуация... А я уж думал, что у меня компилятор глючит. Добавлено через 4 минуты Хотя нет, всё равно бред какой-то, ведь в тесте конструктор не вызывается, а вызывается функция из библиотеки, которая уже вызывает конструктор, и которая актуальная.
0
|
||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 15.03.2012, 20:15 | |
|
Так, я окончательно запутался. Попробуйте привести минимальный код, воспроизводящий проблему. Без дополнительных методов, без хитроумных названий классов, без левых библиотек. Просто автономный код, достаточный для того, чтобы понять, что делается в реальном коде и чтобы увидеть аналогичное ему поведение.
0
|
|
|
8 / 8 / 1
Регистрация: 23.09.2011
Сообщений: 45
|
|
| 16.03.2012, 09:38 [ТС] | |
|
Нет, минимальный код привести не могу, видимо, произошло это случайно. Как именно - сам не понимаю. Есть библиотека, в ней класс, и есть исполняемый файл, который создаёт объект этого класса. Исполняемый файл был слинкован со старой версией библиотеки, где был один конструктор класса, и этот класс вроде бы имел множественное наследие от двух классов. Потом исполняемый файл не менялся, а библиотека обновлялась, при этом класс уже не имел множественного наследия (имея тип void* сложно определить, на объект какого класса он указывает, чтобы привести к нужному типу), но имел несколько конструкторов.
По идее в этом случае должна была вылетать ошибка исполнения или вообще программа должна была не запуститься, потому что нужного класса уже нет в библиотеки, но почему-то происходила вот такая странная вещь.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 16.03.2012, 12:44 | |
|
Т.е. теперь всё нормально?
0
|
|
|
8 / 8 / 1
Регистрация: 23.09.2011
Сообщений: 45
|
|
| 16.03.2012, 14:45 [ТС] | |
|
Да, теперь всё работает, спасибо, что попытались в моей проблеме разобраться. Хотя я так и не разобрался в том, почему это вообще происходило, даже воспроизвести не получается.
0
|
|
| 16.03.2012, 14:45 | |
|
Помогаю со студенческими работами здесь
12
Конструктор класса, конструктор копирования запускается не тот который нужен Почему вызывается не тот метод? Не вызывается конструктор Наследование(Не вызывается конструктор) Конструктор класса не вызывается Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|