упростить конструкцию С++ (есть хитрая конструкция, возможно ли упростить?)

Модератор: Модераторы разделов

Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

упростить конструкцию С++

Сообщение sarutobi »

вот такая строка

Код: Выделить всё

Object* obj = *((Object**) getValue());

Возможно ли её упрощение (и как) при следующих допущениях:
прототип getValue (void*) getValue()
то значение, которое передано в качестве возвращаемого - указатель
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: упростить конструкцию С++

Сообщение drBatty »

sarutobi писал(а):
10.10.2007 10:15

Код: Выделить всё

Object* obj = *((Object**) getValue());

так было принято писать в Си без плюсов. В C++ для этого есть классы и/или шаблоны.
Выглядеть будет совсем просто:
Object obj(foo);
Где foo - это экземпляр класса реализующий твою Value.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: упростить конструкцию С++

Сообщение sarutobi »

drBatty,
Вы вопрос то поняли? Или так, "на огонек поболтать заглянули"?
поясняю - функция возвращает указатель неопределенного типа, который можно кастовать. изменить функцию я не могу. передаваемое в качестве возвращаемого значения (в другом месте) - указатель на уже созданный объект. в результате функция возвращает Object**. Мне нужно получить указатель на объект.
Вопрос к Вам - при чем здесь классы, шаблоны и создание стекового объекта?
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: упростить конструкцию С++

Сообщение sergio »

Ничего "хитрого" в "конструкции" в упор не вижу, и упрощать тут нечего и незачем. Это не "конструкция си++", а конструкция си, самая дубовая. В си++ кастинги хороший тон оформлять по-другому. (А совсем хороший тон - дизайнить так, чтоб их по возможности не было.)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: упростить конструкцию С++

Сообщение serzh-z »

Наверное я не врубился в задачу - но к чему такие сложности?
Это:
Object* obj = (Object*) getValue();
не устраивает?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: упростить конструкцию С++

Сообщение v04bvs »

static_cast<Object*>(getValue());
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: упростить конструкцию С++

Сообщение sergio »

v04bvs писал(а):
10.10.2007 12:42
static_cast<Object*>(getValue());


Если
void* getValue()
в результате функция возвращает Object**. Мне нужно получить указатель на объект.

то скорее

Object* p = * reinterpret_cast<Object**>(getValue());
?
(т.е. примерно то же, что и было :) )
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: упростить конструкцию С++

Сообщение v04bvs »

А, ну да, неправильно прочитал.

Вообще кривой дизайн, void* не нужен. В крайнем случае возвращать ссылку на указатель.
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: упростить конструкцию С++

Сообщение sarutobi »

ответившим спасибо...
дизайн не кривой - это связка lua и c++ с целью доступа к объектам с++, созданным в lua
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: упростить конструкцию С++

Сообщение drBatty »

sarutobi писал(а):
10.10.2007 11:00
drBatty,
Вы вопрос то поняли? Или так, "на огонек поболтать заглянули"?
<...>
Вопрос к Вам - при чем здесь классы, шаблоны и создание стекового объекта?

Прошу прощения, просто это не конструкция C++, и в рамках C++ вы можете выполнить ту же задачу классами, шаблонами и стёковыми объектами(и/или ещё сотней способов). Если же вы не можете изменить эту функцию, может есть смысл написать к ней обёртку, и далее использовать её(обёртку) в рамках С++?

А в Си без плюсов, я бы так и оставил. Так вобщем-то все всегда и делают.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: упростить конструкцию С++

Сообщение sarutobi »

drBatty,
это как раз и есть обертка.... вы можете подсказать другое решение?
вот собственно задача: из lua скрипта передается созданный в нем объект С++. В терминологии lua это userdata, в терминологии С/С++ это pointer. функция getuserdata() из API lua возвращает (void*)
поэтому и возникает Object**, который требуется преобразовать к Object*.
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: упростить конструкцию С++

Сообщение serzh-z »

sarutobi писал(а):
10.10.2007 15:38
поэтому и возникает Object**, который требуется преобразовать к Object*.
Не понятно - если функция возвращает указатель на объект, а не указатель на указатель на объект, для чего вводить лишний кастинг в (Object **)? Чтобы просто потом, от нечего делать, его разыменовывать?
Спасибо сказали:
Аватара пользователя
sarutobi
Сообщения: 676
Статус: Добрость и скромнота
ОС: Debian 5, FreeBSD 6.2/8.0

Re: упростить конструкцию С++

Сообщение sarutobi »

функция возвращает (void*), который есть указатель на userdata lua или, что то же самое, на pointer C.
Fire and water, earth and sky - mistery surrounds us, legends never die!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: упростить конструкцию С++

Сообщение drBatty »

sarutobi писал(а):
10.10.2007 15:38
это как раз и есть обертка.... вы можете подсказать другое решение?
<...>
поэтому и возникает Object**, который требуется преобразовать к Object*.

нет, не могу. Ведь у вас всё сделано правильно: если функция возвращает указатель на указатель, под видом void*, то надо во первых преобразовать void* обратно, и если тебе нужен сам указатель - разименовать. Я не могу понять, что тут можно упрощать? А раз это обёртка - так пусть там, внутри обёртки этот ужас остаётся :) Я сам писал так-же, когда было лениво/невозможно изменить такую вот getValue()

PS: А вот почему я написал, что это "ужас":
Это:

Код: Выделить всё

Object* obj = (Object*) getValue();
не устраивает?

Я сам несколько раз так ошибался, причём компилятор молчит, и даже программа часто работает(хотя и с глюками, конечно).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: