Название: Привести член к классу Отправлено: Igors от Октябрь 29, 2012, 16:08 Добрый день
Есть структурка Код В какой-то момент внутри ф-ции DoSomething я узнаю что CPixel не какой-нибудь, а именно член класса CMyContext (исходя из др данных задачи). Как мне теперь заполучить указатель на CMyContext ? Спасибо Название: Re: Привести член к классу Отправлено: Serr500 от Октябрь 29, 2012, 16:18 1) Поле parent в CMyPixel.
2) Какой-нибудь общий/глобальный массив вида (CMyPixel, CMyContext). Название: Re: Привести член к классу Отправлено: Serr500 от Октябрь 29, 2012, 16:20 3) А вот похитрее. Смещение mPixel в структуре известно. CMyContext можно получить как pix - offset(mPixel).
Название: Re: Привести член к классу Отправлено: Igors от Октябрь 29, 2012, 16:45 3) А вот похитрее. Смещение mPixel в структуре известно. CMyContext можно получить как pix - offset(mPixel). Ну да, так ведь это же "С приведение" и все такое - тут же все грамотные, заклюют :) Может есть козырный ++ способ ?Название: Re: Привести член к классу Отправлено: Akon от Октябрь 29, 2012, 19:33 Ну вот с т.з. DoSomething зачем ей знать, что переданный объект член чего то там. Поэтому, либо передавать содержащий объкут, либо сделать двунаправленнуя связь, т.е. parent.
Цитировать 3) А вот похитрее. Смещение mPixel в структуре известно. CMyContext можно получить как pix - offset(mPixel). Это только как временный хак.Название: Re: Привести член к классу Отправлено: Igors от Октябрь 29, 2012, 20:17 Ну вот с т.з. DoSomething зачем ей знать, что переданный объект член чего то там. Поэтому, либо передавать содержащий объкут, либо сделать двунаправленнуя связь, т.е. parent. А кто приводил пример кросс-приведения в случае множественного наследования? Та можно сказать "рекомендовал" :) А тут членство вместо наследования - частая альтернатива.Передача содержащего - явно навязанный параметр, который придется совать и совать "сверху" пока дело дойдет до DoSomething которая на самом низком уровне. Делать парента - также искусственно, что это за парент если его не назначают? Да и ничем оно не чище - после первого же копирования. 3) CMyContext можно получить как pix - offset(mPixel). Кстати откуда взять offset и вообще как это приличнее записать?Название: Re: Привести член к классу Отправлено: Akon от Октябрь 29, 2012, 23:07 Цитировать А кто приводил пример кросс-приведения в случае множественного наследования? Та можно сказать "рекомендовал" А тут членство вместо наследования - частая альтернатива. :) Согласен. Но там это было от своего рода безысходности. Если бы поддерживалось моком множественное да и до кучи виртуальное наследование от QObject, проблемы бы не было. У вас же руки развязаны. Цитировать Передача содержащего - явно навязанный параметр, который придется совать и совать "сверху" пока дело дойдет до DoSomething которая на самом низком уровне. Делать парента - также искусственно, что это за парент если его не назначают? Да и ничем оно не чище - после первого же копирования. Есть CMyContext и CMyPixel. Вы можете:1. Передавать CMyContext и оставить однонапраленную связь CMyContext -> CMyPixel. 2. Передавать CMyPixel и сделать двунапраленную связь (парент) CMyContext <-> CMyPixel. Тут же получаете все проблемы двунаправленных ассоциаций. Я так понимаю, у вас классы-значения и всякие там ссылки (паренты) здесь не уместны. 3. Расширить функцию: void DoSomething(CMyContext*, CMyPixel *); Недостаток в том, что можно подать пиксел не из того контекста. Достоинство - не нужно вводить связь между классами. Я довольно часто пользуюсь этив вариантом. Цитировать Кстати откуда взять offset и вообще как это приличнее записать? Когда размер указалеля на член == sizeof(void*), то как-т так:Код: void DoSomething(CMyPixel *) Название: Re: Привести член к классу Отправлено: Serr500 от Октябрь 30, 2012, 08:04 Ну да, так ведь это же "С приведение" и все такое - тут же все грамотные, заклюют :) Может есть козырный ++ способ ? Нехай размер указалеля на член > sizeof(void*) Приведите примерчик.Название: Re: Привести член к классу Отправлено: Syveren от Октябрь 30, 2012, 09:46 Цитировать Кстати откуда взять offset и вообще как это приличнее записать? #include <stddef.h>Код
По мне так самый правильный способ передавать CMyContext. А уже внутри выуживать его элемент. Название: Re: Привести член к классу Отправлено: Igors от Октябрь 30, 2012, 12:05 Я сделал так
Код Что по существу ничем не отличается от варианта Syveren. Делать это макросом на мой взгляд неуместно, т.к. ни к чему поощрять использование такой конструкции. Да, возможны перекрытые операторы (char *) и/или &. Но с др стороны Код
Akon, попытки сделать это "просто корректным" введя доп поля (связи) разбиваются просто Код Выясняется что CMyPixel не может решить что же с парентом, в результате каждое присвоение потребует внимания - такое лекарство хуже болезни Название: Re: Привести член к классу Отправлено: Akon от Октябрь 31, 2012, 21:13 Цитировать static_cast<TYPE *> (0)->MEMBER А до этого я сходу не допер :)Цитировать Akon, попытки сделать это "просто корректным" введя доп поля (связи) разбиваются просто Да, разумеется это большой напряг. Этот вариант, как правило, применяется для классов-сущностей (а они, как правило, с Q_DISABLE_COPY)Код C++ (Qt) CMyPixel::CMyPixel( const CMyPixel & ) { //.. ??? } Выясняется что CMyPixel не может решить что же с парентом, в результате каждое присвоение потребует внимания - такое лекарство хуже болезни |