Russian Qt Forum
Ноябрь 23, 2024, 20:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Как преобразовать указатель на QObject в указатель на объект нужного класса?  (Прочитано 57291 раз)
spirit
Гость
« Ответ #45 : Октябрь 22, 2008, 16:27 »

не используйте С++. а раз уж используете, то вы обязаны это знать.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #46 : Октябрь 22, 2008, 16:42 »

Вы считаете такую путаницу нормальной? Я нет.

То что вы этого не понимаете неозначает, что это некому ненужно. Извените, но я немогу уловить нималейшей связи между семантикой функции qPrintable и приведеной вами страницы про модификатор const из книги  Непонимающий
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #47 : Октябрь 22, 2008, 17:13 »

Вы считаете такую путаницу нормальной? Я нет.
2 xintrea
Все что ты пишешь про const, сводится к фразе: Я не могу понять как пользоваться const, поэтому все кто его использую - дураки. Глобально.  Смеющийся

Вот смотри, если бы qPrintable было бы описано, как char* qPrintable(...), то обязательно нашелся бы умник, который бы сделал ПРИМЕРНО так:
Код:
char *p = qPrintable( str );
p[10345] = 0;
Как ты думаешь, к чему бы это привело?
А так тебе дадут по рукам еще на этапе компиляции.
Записан
ритт
Гость
« Ответ #48 : Октябрь 22, 2008, 18:14 »

судя по размеру скана выше, могу предположить, что это какой-то карманный справочник...и примеры там призваны _прояснить_ ситуацию, а не доказывать сложность конструкции. не, не проясняют?

я плюсы начинал учить лет в 15 по книжке самостоятельно (преподы в школе знали только паскаль). что было непонятно, перечитывал, пока не приходило понимание, т.к. писать методом тыка считаю неприемлемым.
и о чудо! - спустя столько лет, пусть я долгое время вообще и не писал на плюсах, ну не запутывает меня const char* и всё тут!
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #49 : Октябрь 22, 2008, 19:40 »

Цитата: BRE link=topic=7830.msg41169#msg41169

2 xintrea
Все что ты пишешь про const, сводится к фразе: Я не могу понять как пользоваться const, поэтому все кто его использую - дураки. Глобально.  Смеющийся

Ну, ненадо говорить за другого человека.

Чего я действительно не могу понять, так это смысла защищать результаты вычислений.

Понятно, что (возможно) нужно защищать передаваемые параметры, чтоб программер был спокоен, что с его данными ничего не случится. Хотя, такое поведение должно быть у любой функции по умолчанию (если не требуется, конечно, целенаправленного изменения переданных данных). И показывать const в параметре - это, извините, моветон. Конечно, при передачи через ссылку показывать const нужно, типа "чувак, ты конечно ссылку передаешь, но небаись, это только для доступа к преобразуемой строке, мы с ее содержимым по известному нам адресу ничего делать не будем". Но зачем громаздить такие понятийные слои, когда можно передать по значению? Да, с точки зрения оптимизации надо кувыркаться с указателями ( const QString & str ). А с точки зрения передачи смысла, для отображения "что делает функциия" надо писать ( String  str ) и никак иначе. В нынешних реалиях от языка требуется именно вторая воможность, чтобы API библиотек и код программы отображал в явном виде действия над данными, а не запутывал лишний раз программиста.


Цитата: BRE link=topic=7830.msg41169#msg41169

Вот смотри, если бы qPrintable было бы описано, как char* qPrintable(...), то обязательно нашелся бы умник, который бы сделал ПРИМЕРНО так:
Код:
char *p = qPrintable( str );
p[10345] = 0;
Как ты думаешь, к чему бы это привело?
А так тебе дадут по рукам еще на этапе компиляции.

Скажу по секрету, что обязательно найдется умник, который сделает так

Код:
char *p = (char *)qPrintable( str );
p[10345] = 0;

потому что полученную строку ему надо еще как-то преобразовывать. Объясните, для чего защищать через const результат вычисления?
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #50 : Октябрь 22, 2008, 20:05 »

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

Да, это такой небольшой карманный справочник, на 500 страниц.

я плюсы начинал учить лет в 15 по книжке самостоятельно (преподы в школе знали только паскаль). что было непонятно, перечитывал, пока не приходило понимание, т.к. писать методом тыка считаю неприемлемым.
и о чудо! - спустя столько лет, пусть я долгое время вообще и не писал на плюсах, ну не запутывает меня const char* и всё тут!

Коль всеравно флеймим... Улыбающийся

Я ассемблер начал учить лет в 14 по документации, которая шла в составе компьютера (преподы в школе знали только бейсик). Что было непонятно - проверял в коде, пока не приходило понимание, т.к. писать методом "так должно работать, потому что так написано" считаю неприемлемым.
и о чудо! - спустя столько лет, пусть я долгое время вообще и не писал на ассемблере, ну не запутывает меня LEA инструкция и всё тут!
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #51 : Октябрь 22, 2008, 20:06 »

Пастор уже раза два говорил: QString - шаренный класс. const QString& позволит работать с объектом быстрее, т.к. под объект не придётся создавать глубокую копию объекта - можно работать с объектом напрямую. а const позволяет быть уверенным, что объект вернётся из вызова таким же, каким ушёл - без изменений.

надеюсь, я доходчиво объяснил. не будем к этому возвращаться?

Цитировать
Скажу по секрету, что обязательно найдется умник, который сделает так
Код:
char *p = (char *)qPrintable( str );
p[10345] = 0;
отбить такому умнику руки! по аналогии с электрощиком, на котором написано "не влезай - убьёт" (и ведь убьёт же), а он всё-равно лезет.
Записан
ритт
Гость
« Ответ #52 : Октябрь 22, 2008, 20:07 »

> не запутывает меня LEA инструкция и всё тут
асм не запутывает, а const char* выше понимания? не верю...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #53 : Октябрь 22, 2008, 20:09 »

Но зачем громаздить такие понятийные слои, когда можно передать по значению?

    Как зачем??? Вы понимаете сам процесс передачи по значению? Что при этом происходит? А если передаеться огромный объем данных? (Ответ домыслите сами)

Да, с точки зрения оптимизации надо кувыркаться с указателями ( const QString & str ).

Это ссылка, а не указатель!

А с точки зрения передачи смысла, для отображения "что делает функциия" надо писать ( String  str ) и никак иначе. В нынешних реалиях от языка требуется именно вторая воможность, чтобы API библиотек и код программы отображал в явном виде действия над данными, а не запутывал лишний раз программиста.

В Qt для шаровых классов передача по значению и по константной сылке равнозначны впринципе (копирования не происходит). Но... принято использовать константный указатель (так немного быстрее, непроисходит инкремент\дикремент счетчика ссылок). Я уже про это писал. Вы знакомы с работой шаровых классов? Почитайте...

Скажу по секрету, что обязательно найдется умник, который сделает так

Код:
char *p = (char *)qPrintable( str );
p[10345] = 0;

потому что полученную строку ему надо еще как-то преобразовывать. Объясните, для чего защищать через const результат вычисления?


Ну это он уже сам нарываеться на проблему. Кто ему доктор что он так сделае? Результат нужно защищать через конст, чтобы не иметь возможноти его модификации, т.к. неизвесно сколько буде валиден возвращаемый указатель Нужно модифицировать - копируй.

ЗЫ: В случае с qPrintable, указатель p будет невалиден после вызова функции:

Код:
char *p = (char *)qPrintable( str );
p[10345] = 0;   //указател невалиден!

Это также относиться к таким мтодам QString, как toLocal8Bit, toAscii, и это неотноситься к С++. Это ньюансы Qt.


А если не секрет, на чем вы писали до С++, Pascal?
« Последнее редактирование: Октябрь 23, 2008, 14:17 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #54 : Октябрь 22, 2008, 20:21 »

да уж, надо учить плюсы срочно и не задавать "умных" вопросов.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #55 : Октябрь 22, 2008, 22:50 »

> не запутывает меня LEA инструкция и всё тут
асм не запутывает, а const char* выше понимания? не верю...

Ну уж поверьте. Разберитесь с асмом, и вы поймете насколько в нем все просто. Главное понять, как устроен микропроцессор - что такое регистры общего назначения, адресные регистры, флаги, стек, сегменты памяти.

Аналог "ссылки" реализуется в ассемблере очень просто:

Код:
; Загрузить в регистр AL значение, расположенное по некоторому адресу (в регистре BX лежит адрес)
MOV AL, [BX]

Но чаще всего адрес высчитывается не напрямую, а несколькими командами. Тогда используется конструкция
Код:
; Загрузить в регистр SI некий хитро вычисленный адрес
LEA SI, [BX+DI]

; Загрузить в аккумулятор значение байта памяти, расположенного по адресу, указанному в регистре SI.
MOV AL, [SI]

Для последовательности байт (массивы), поиск символа:
Код:
LEA DI,[BX].filename ; Загружаем в регистр DI некий адрес начала строки
CLD                  ; При каждой итерации, DI будет увеличиваться (сканирование вперед)
MOV CX,100           ; В регистр CX загружаем длину строки (100 байт)
MOV AL,'a'           ; какой символ будем искать

; А вот и сама команда поиска
; Пробегаем область памяти, начиная с ячейки, адрес которой лежит в DI
; Проверяем, не содержится ли в ячейке символ 'a'
; После проверки каждой ячейки DI автоматически увеличится на единицу
; Будет обработано количество ячеек, указанное в CX
; После проверки каждой ячейки CX автоматически уменьшится на единицу
; Поиск либо завершится досрочно, если будет встречен символ 'a'
; либо пробежит все 100 байт
REPNE SCASB

JNE FIN              ; Ежели ничего не найдено, прыгаем на код, который обрабатывает ситуацию что ничего не найдено
...                  ; А здесь код, который обрабатывает ситуацию что символ найден

Весь ассемблер - это по сути оперирование регистрами и командами, которые могут взять данные из одного адреса памяти, и положить данные в нужный адрес памяти. Все. И никаких тебе "ссылок" и "указателей". Точнее, их можно реализовать (и указатель на указатель на указатель), но при реализации видно, как что конструируется. А так же нет синтаксических залипух типа "* как тип указателя", "* как разыменовывание указателя", "& как ссылка", "& как адрес" (какой садист до этого додумался?), "**", "***", ".", "->" и т.д.
« Последнее редактирование: Октябрь 22, 2008, 23:04 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
spirit
Гость
« Ответ #56 : Октябрь 22, 2008, 22:55 »

а почему вы тогда на плюсах пишите? пишите на ассемблере , если там все так просто и "наглядно".   Подмигивающий
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #57 : Октябрь 22, 2008, 23:07 »

а почему вы тогда на плюсах пишите? пишите на ассемблере , если там все так просто и "наглядно".   Подмигивающий

Вы про слои абстракции что-нибудь слышали?
Записан

Собираю информацию по крупицам
http://webhamster.ru
spirit
Гость
« Ответ #58 : Октябрь 22, 2008, 23:16 »

если честно, то меня эта тупая и бессмысленная тема уже утомила. то что вы поститет отностится к выражениям по типу "с точки зрения банальное эрудиции....". в общем читать, читать и еще раз читать как говорит Константин и не морочить головы людям.
Записан
ритт
Гость
« Ответ #59 : Октябрь 22, 2008, 23:41 »

> Разберитесь с асмом
асм я пытался учить ещё до плюсов, потом пришлось всё вспоминать заново в универе, сейчас вряд ли смогу написать что-то осмысленное целиком на асме, но примитивы не забываются - это как езда на велосипеде...
Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.136 секунд. Запросов: 23.