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

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

Страниц: 1 ... 3 4 [5] 6   Вниз
  Печать  
Автор Тема: Как преобразовать указатель на QObject в указатель на объект нужного класса?  (Прочитано 57307 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

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

Тут вы меня пугаете... Как так неизвестно, сколько будет валиден возвращаемый указатель? То есть, если указатель защищен const, то известно? А если не защищен const, то неизвестно? Как то это странно все, проясните пажалусто.


А если не секрет, на чем вы писали до С++, Pascal?

Ничего особенного. Как уже выяснили, на ассемблере писал. Фокс, 1С по работе. PHP для интереса. Ну ActionScript2 для интереса. Паскаль один раз использовал как алгоритмический язык, можно было на любом другом языке алгоритм реализовывать (делал дихотомайзер).

Как оказалось, чтобы начать понимать C++, вначале легче понять ООП в PHP или в ActionScript, а уже потом в C++. И я не один такой, мы с парой перцев про это говорили, у них такая же ситуация. Хотя, сложность C/C++ не в инструментах ООП, а в этих вот указателях и ссылках, которые являются постоянным источником проблеммы, причем не только у меня, а и у мегапрофи, проверено. И сложности добавляет неоднозначность синтаксиса.

Зачем для разных действий (* как ссылочный тип), (* как разыменовывание указателя), (& как адрес), (& как ссылка), сделали одинаковое обозначение? Мне непонятно.

Так же непонятно, зачем для одного и того же действия сделали разное обозначение (. доступ к члену если работаем с объектом), (-> доступ к члену если работаем с ссылкой на объект). Зачем так извратно?

Понятно, что это проблемы роста языка, "обвешивание" функционалом "на лету". Но ведь были другие пути, более удобные для конечного использования. Зачем было делать такие залипухи, если сразу еще при проектировании было ясно - получится хреново! Сами путаться будете, и неофитам хренобъясните что к чему.
Записан

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

ООП в пыхпыхе? Улыбающийся)

> Зачем для разных действий (* как ссылочный тип), (* как разыменовывание указателя), (& как адрес), (& как ссылка), сделали одинаковое обозначение? Мне непонятно.

они ж ставятся с разных сторон операнда - один раз запомнить что есть что - и никаких проблем уже не будет...как и с const'ом )
с "." и "->" тоже всё предельно ясно - член объекта и член объекта по указателю соответственно...

> если сразу еще при проектировании было ясно - получится хреново!
это я уже считаю оскорблением!
Записан
BRE
Гость
« Ответ #62 : Октябрь 23, 2008, 00:12 »

[off]  Смеющийся Вот и дожили... Знанием асма снова начали гордится.
Первый освоенный асм от процессора 6502. Была такая машина Commodore 64, было это в 1988 г. Помню его до сих пор, эх были времена, какие вещи делали, как код оттачивали... Потом 8086, 80286, 80386, 80486. Потом пошли пентимумы, и писание на голом асме потеряло смысл, сравниваться с оптимизаторами стало не реально.
Теперь идут жабы, делфи и всякая такая фигня. Прогресс блин.
[on]

2 xintrea
Не знаю правда для чего были приведены примеры на асме, но....

Код:
const char *qPrintable( const QString &str );

Любой программист смотря на это определение и не глядя на код самой функции отмечает для себя, что те данные на которые возвращается указатель, модифицировать нельзя. Это наглядно и понятно.
Теперь по поводу параметра. С точки зрения эффективности лучше передать ссылку на объект, чем сам объект, и это не прихоть разработчиков Qt, а требование эффективности. Почитай чем отличаются передача ссылки от передачи объекта в функцию или дисассемблируй, думаю все стенет ясно.  Подмигивающий
Записан
BRE
Гость
« Ответ #63 : Октябрь 23, 2008, 00:17 »

Как оказалось, чтобы начать понимать C++, вначале легче понять ООП в PHP или в ActionScript, а уже потом в C++.
Я учил после C, и ты знаешь не путаюсь ни в чем. Надо ActionScript посмотреть...

И я не один такой, мы с парой перцев про это говорили, у них такая же ситуация. Хотя, сложность C/C++ не в инструментах ООП, а в этих вот указателях и ссылках, которые являются постоянным источником проблеммы, причем не только у меня, а и у мегапрофи, проверено. И сложности добавляет неоднозначность синтаксиса.
Ты по меньше общайся с такими МЕГАПРОФИ.  Подмигивающий
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

ООП в пыхпыхе? Улыбающийся)

Ну да. Декомпозиция задачи (классы), инкапсуляция, наследование (кроме множественного). Все это в PHP есть, и для стартового понимания хорошо подходит.


> Зачем для разных действий (* как ссылочный тип), (* как разыменовывание указателя), (& как адрес), (& как ссылка), сделали одинаковое обозначение? Мне непонятно.

они ж ставятся с разных сторон операнда - один раз запомнить что есть что - и никаких проблем уже не будет...как и с const'ом

Ну вот давайте посмотрим на прототип в QtAssistant

Код:
const char * qPrintable ( const QString & str )

Кутешники хитрые ребята, и написали так, что ясности нет, чему принадлежат * и &, ибо синтаксис позволяет.

И вот товарищ BRE решил объяснить что к чему (это похвально, без издевки), и написал так:

Код:
const char *qPrintable( const QString &str );

Но вот что-то мне подсказывает, что правильно было бы написать так:

Код:
const char *qPrintable( const QString& str );

ведь у нас в аргументе ссылка, а не адрес.


Налицо проблема - куда прилеплять эти синтаксические элементы (*, &) для правильного описания выполняемых кодом действий?

Ведь впринципе код

Код:
const char * qPrintable()
const char* qPrintable()
const char *qPrintable()

const QString & str
const QString& str
const QString &str

при компиляции даст одинаковый результат (хотя с & надо еще проверить..). Но тогда встает вопрос, что является операндом, относительно которого можно ориентироваться "слева" или "справа"?

Код:
char*         ?
*qPrintable() ?
QString&      ?
&str          ?

Если бы синтаксис не разрешал использовать как попало * и &, было бы гораздо легче. Но мы имеем то, что имеем. Посему вопрос открыт - какое мнемоправило использовать для вычленения операнда? Оно просто необходимо, чтобы после определения операнда уже думать, куда лепить * или &.


> если сразу еще при проектировании было ясно - получится хреново!
это я уже считаю оскорблением!

Не принимайте все так близко к серццу.
Записан

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

2 xintrea
Почитал тут два ваших топика и решил написать. Первое впечетление шок. Щас не знаю или мне дико ржать или же плакать. Ясно точно одно вам следует приостановить какие либо разработки и читать про указатели и ссылки(возможно еще про что-то). В топике http://www.prog.org.ru/topic_7895_15.html вы писали про семантику языка, так вот семантики С++ вы не знаете. Вобще какая разница возле чего стоит '&' или '*'(сдесь у меня вобще чувство что вы писали на Fortrane), главное в каком месте мы используем их. Так вот определение того что у перед нами указатель( или ссылка), а не разыменовывание указателя( или взятие адреса) - это использование его в объявлениях переменных и ф-ций.
Раз уж вы так любите практику давайте расмотрим несколько примеров:
Код:
char * string = "xintrea вы должны учить С++!";
char * foo();
char ** foo2();
char (*f)();
char *(*f2)();
char * p1, p2;
Прежде всего хочу обратить ваше внимание что здесь мы объявляем переменные и ф-ции. Поэтому использование символа '*' означает объявления указателя на что-то. В первом случае мы имеем указатель на область памяти котрую нужно интепритировать как символ или проще говоря у нас здесь "С-строка". Во втором - мы имеем ф-цию которая возвращает указатель на char. В 3 - ф-цию которая возвращает указатель на указатель(В С к примеру так возвращали массивы строк). В 4 у нас указатель на ф-цию, причем заметьте понимание того, что у нас указатель на ф-цию приходит не из местоположения *, а из скобок в которые заключены *f. 5 случае у нас указатель на ф-цию возвращающий указатель на char. В 6 случае у нас р1 указатель, а р2 нет, т.к. символ * всегда относиться к имени переменной а не к типу. Теперь вы можете удалять пробелы между * и типом или именем переменной/ф-ции( или добавлять их), это ничего не изменит(поймите это раз и на всегда!!! это не fortran).
Идем дальше - ссылки. Пример:
Код:
int x1 = 10;
int & x2 = x1;

int & x3 = x1, x4 = x2;

void foo( const QString& s);
Думаю тут все понятно по аналогии с указателями. В 3-м случае у нас х3 ссылка, а х4 - нет. При объявлении ф-ции параметр интерпритируеться как константная ссылка и только. Про пробелы аналогично с предыдущим абзацем.
Проще говоря использование * и &  с типами говорит нам об указателе и ссылке.
И так осталось разименование и взятие адреса. Взятие адреса используеться в rvalue выражениях и при инициализации:
Код:
int x1 = 10;
int * p = &x1;// р ссылаеться на х1
int * q;
q = &x1;// q ссылаеться на х1
Разименование используеться в lvalue, rvalue и при инициализации:
Код:
int x1 = 10, x2;
int * p = &x1;
x2 = * p; // исп. как rvalue
int x3 = *p;// x3 == 10
* p = x2 * x3;//исп. как lvalue
Возможно я что-то упустил или забыл(или в чем то ошибся знающим бейте по рукам но не сильно Улыбающийся), поэтому вам следует прислушаться к советам окружающих и взяться за букварь по С++, потому как указатели и ссылки в С++ - это как таблица умножения в математике.
З.Ы. Думаю тему пора закрыть и так понятно чего человек не знает( на что ему не однократно указывали)
Записан
ритт
Гость
« Ответ #66 : Октябрь 23, 2008, 06:56 »

всем спасибо за весёлое утро! я плакал...
вот - http://dr--zoidberg.livejournal.com/291818.html - посмейтесь ещё Подмигивающий

den'ka, зачОт!
ветку сносить не буду - она и так в кандидатах ))
Записан
denka
Гость
« Ответ #67 : Октябрь 23, 2008, 08:13 »

den'ka, зачОт!
ветку сносить не буду - она и так в кандидатах ))
Жаль стока писал, жене спать мешал, а тему удалят Крутой
Записан
Вячеслав
Гость
« Ответ #68 : Октябрь 23, 2008, 08:37 »

Так всем здрасте - меня тут очень долго не было , но Костя вытащил из сна - сказал что повеселиться можно ;)И точно Подмигивающий

Ну вот давайте посмотрим на прототип в QtAssistant

Код:
const char * qPrintable ( const QString & str )

Кутешники хитрые ребята, и написали так, что ясности нет, чему принадлежат * и &, ибо синтаксис позволяет.

И где здесь неоднозначность ? RTFM Страуса - в прототипе функции оператора взятия адреса объекта не может быть по опеделению .Слив зачитан.
Далее .. красота ассемблера - а уважаемй апологет ассемблера слышал такие ругательства ARM,MIPS,Cell ? Хотя суда по интеловскому синтаксису команд LEA BX скорее всего нет.... И даже для интела сейчас _нормальную_ прогу на ассемблере руками написать практически не реально - так-как просчитать конвеер для тогож SSE2 при нормальном взаимодействии с перефирией - не реально.... Да и никакая операционка нормальная не пустит на тот уровень где нужен щаз ассемблер...А нужен он IMHO при нестандартных железяках и программировании очень не тривиальных вещей....НУ нафига сейчас пытаться оптимизировать копейки , если 90% времени в обычной проге( я не беру случаев тяжелых расчетов - тама отдельная пестня) проц маятся дурью ? Особенно при наличии пары-четверки ядер ? И спрашиваеться зачем заниматься лишний писаниной ,когда ее(писанину) с чистой совестью можно свалить на компилятор ?
И еще - программу( не децкую поделку, а именно серьезную вещь) на ассемблере крома автора за приемлимое время человек со стороны просто не освоит.Каким бы он небыл спецом ... К сожалению это факт .. Особенно если прога делает нечто нетривиальное и во всю пользуеться особенностями конкретной архитектуры...Даже если она документирована по ГОСТ'у  и даже если автор согласен пообщаться Подмигивающий

Таки резюме - если в прикладной задаче сейчас вылезает асм - IMHO  в консерватории чего-то не впорядке Подмигивающий
« Последнее редактирование: Октябрь 23, 2008, 08:43 от Вячеслав » Записан
ритт
Гость
« Ответ #69 : Октябрь 23, 2008, 08:47 »

н-да...последняя строка не в тему, но про понятность/читабельность кода на асме в принципе всё верно...

пофлеймим ишчо? )
Записан
Вячеслав
Гость
« Ответ #70 : Октябрь 23, 2008, 08:50 »

н-да...последняя строка не в тему, но про понятность/читабельность кода на асме в принципе всё верно...

пофлеймим ишчо? )
А почему не тему ? Пример _необходимости_ в _прикладной_ задаче асма в студию !!!
Записан
ритт
Гость
« Ответ #71 : Октябрь 23, 2008, 08:57 »

мм...например, когда-то ещё в багланде писал приложение для манипуляции растровой графикой...как бы те же плюсы, скорость работы высокая (должна быть), но применение фильтров к большим картинкам тормозило безбожно - приходилось подобные операции писать на асме...
навскидку больше ничего не приходит на ум Улыбающийся
Записан
BRE
Гость
« Ответ #72 : Октябрь 23, 2008, 09:35 »

мм...например, когда-то ещё в багланде писал приложение для манипуляции растровой графикой...как бы те же плюсы, скорость работы высокая (должна быть), но применение фильтров к большим картинкам тормозило безбожно - приходилось подобные операции писать на асме...
навскидку больше ничего не приходит на ум Улыбающийся
В те далекие времена, очень часто использовался ассемблерный код, критические вещи можно было руками оптимизировать лучше, чем это делал компилятор. Сейчас я сильно сомневаюсь, что кто-то сможет за приемлемое время под современные процы написать код оптимальней чем это сделает комилятор.
Записан
ритт
Гость
« Ответ #73 : Октябрь 23, 2008, 13:45 »

Оо, взрыв мозга Улыбающийся
Код:
QWidgetPrivate* const d_ptr;
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



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

den'ka, зачОт!
ветку сносить не буду - она и так в кандидатах ))
Жаль стока писал, жене спать мешал, а тему удалят Крутой

Ваш техт я себе в мемориз сохранил. Попросите одминов, может ветку в апстрим вернут.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: 1 ... 3 4 [5] 6   Вверх
  Печать  
 
Перейти в:  


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