Миссия не выполнима, или возможно ли...
От: last_nefelim  
Дата: 11.12.03 18:12
Оценка:
Привет всем!
Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы. Возможно вложение (BasicObject отец А, А отец В и тд...)То есть имеем примерно такой код:

typedef int BOOL;
enum
{
FALSE=0,
TRUE=1
};

class BasicObject
{
public:
BasicObject();
~BasicObject();
virtual BOOL respondsToSelector(char* aSelector);
virtual void* performSelector(char* aSelector);
};

class A: public BasicObject
{
public:
virtual void* function_A();
};

//implementetion

BasicObject::BasicObject()
{
}

BasicObject::~BasicObject()
{
}

BOOL BasicObject::respondsToSelector(char* aSelector)
{
BOOL res = FALSE;
//res = ..... как-то узнаём, есть ли в this-e функция с названием aSelector. Если есть то TRUE, иначе FALSE
return res;
}

void* BasicObject::performSelector(char* aSelector)
{
void* res = NULL;
//res = ..... а тут мы как-то вызываем функцию с названием aSelector, и указатель на результат запоминаем
return res;
}

void* A::function_A()
{
return "call function_A from class A";
}

void main()
{
A* pA = new A();
if (pA->respondsToSelector("function_A")) //должно выполниться
{
printf("%s", pA->performSelector("function_A"));//должно напечатать "call function_A from class A"
}

if (pA->respondsToSelector("function_B")) //не выполняеться
{
printf("%s", pA->performSelector("function_B"));
}
getchar();
delete pA;
}

Возможно ли реализовать respondsToSelector и performSelector?
С надежной на мощь С++ и человеческого разума Сергей.
Re: Миссия не выполнима, или возможно ли...
От: LaptevVV Россия  
Дата: 11.12.03 18:25
Оценка: 2 (1)
Здравствуйте, last_nefelim, Вы писали:

_>Привет всем!

_>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы.
[]
Неоднократно обсуждавшийся вопрос.
Да вот хотя бы 19.08 — посмотри там.
_> С надежной на мощь С++ и человеческого разума Сергей.
Да вот и Герба Саттера похожая задача была. На сайте GotW — задача 71.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Миссия не выполнима, или возможно ли...
От: adontz Грузия http://adontz.wordpress.com/
Дата: 11.12.03 18:58
Оценка:
Здравствуйте, last_nefelim, Вы писали:

То что ты хочешь очень уж сильно напоминает СОМ....
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Миссия не выполнима, или возможно ли...
От: last_nefelim  
Дата: 11.12.03 19:08
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, last_nefelim, Вы писали:


A>То что ты хочешь очень уж сильно напоминает СОМ....

Я портирую програму с ObjectivC, а там используеться такой вызов функций , вот этим и обусловлен вопрос...
Re[2]: Миссия не выполнима, или возможно ли...
От: last_nefelim  
Дата: 11.12.03 19:09
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, last_nefelim, Вы писали:


_>>Привет всем!

_>>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы.
LVV>[]
LVV>Неоднократно обсуждавшийся вопрос.
LVV>Да вот хотя бы 19.08 — посмотри там.
_>> С надежной на мощь С++ и человеческого разума Сергей.
LVV>Да вот и Герба Саттера похожая задача была. На сайте GotW — задача 71.

Спасибо за ответ, я попробую разобраться...
Re[3]: Миссия не выполнима, или возможно ли...
От: alexkro  
Дата: 11.12.03 19:17
Оценка:
Здравствуйте, last_nefelim, Вы писали:

_>Здравствуйте, adontz, Вы писали:


A>>Здравствуйте, last_nefelim, Вы писали:


A>>То что ты хочешь очень уж сильно напоминает СОМ....

_>Я портирую програму с ObjectivC, а там используеться такой вызов функций , вот этим и обусловлен вопрос...

Тебе нужно пересмотреть объектную модель. У ObjC с C++ большие различия в этом смысле. Прямого перевода на C++ все равно нет.

А, кстати, зачем портировать, когда есть ObjC++?
Re[4]: Миссия не выполнима, или возможно ли...
От: last_nefelim  
Дата: 11.12.03 19:46
Оценка:
Здравствуйте, alexkro, Вы писали:

A>Здравствуйте, last_nefelim, Вы писали:


_>>Здравствуйте, adontz, Вы писали:


A>>>Здравствуйте, last_nefelim, Вы писали:


A>>>То что ты хочешь очень уж сильно напоминает СОМ....

_>>Я портирую програму с ObjectivC, а там используеться такой вызов функций , вот этим и обусловлен вопрос...

A>Тебе нужно пересмотреть объектную модель. У ObjC с C++ большие различия в этом смысле. Прямого перевода на C++ все равно нет.


Я как раз это почти и сделал (Макрос подгоняет все к с++, а потом остаётся дело за малым- чуть уточнить...)
Омтались поблеммы с NILL (в ObjC объекту с нулевым адресом можно послать любое сообщение и что-то получить!!!
тоесть
Object* o = NULL; int res = o->function();
У меня такое помрет, а у них вернет 0!!!
Ну и эта (я использую сейчас для respondsToSelector)
BOOL objimpl::respondsToSelector(SEL aSelector)
{
return (aSelector==selector(buttonClick)
|| aSelector==selector(drawSelfForPrinting)
) ? YES : super::respondsToSelector(aSelector);
}

а для performSelector

id objimpl::performSelector_withObject_withObject_withObject(SEL aSelector,id object1,id object2, id object3)
{
if(aSelector==selector(buttonClick)) buttonClick();
else if(aSelector==selector(drawSelfForPrinting)) drawSelfForPrinting();
else return super::performSelector_withObject_withObject_withObject(aSelector, object1, object2, object3);
return nil;
}

неудобно правда?

A>А, кстати, зачем портировать, когда есть ObjC++?

Чтобы долго не розбираться и не овыкать от VC++
Re[2]: Миссия не выполнима, или возможно ли...
От: last_nefelim  
Дата: 11.12.03 21:07
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, last_nefelim, Вы писали:


_>>Привет всем!

_>>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы.
LVV>[]
LVV>Неоднократно обсуждавшийся вопрос.
LVV>Да вот хотя бы 19.08 — посмотри там.
_>> С надежной на мощь С++ и человеческого разума Сергей.
LVV>Да вот и Герба Саттера похожая задача была. На сайте GotW — задача 71.

Прикольно конечно, много нового узнал (по английскому языку ), но! я не могу сделать общий тэмплейт для всей иерархии класов (слишком много функций). Или же я что-то не понял? ?
Re: Миссия не выполнима, или возможно ли...
От: .Mistery Беларусь  
Дата: 12.12.03 09:58
Оценка:
Здравствуйте, last_nefelim, Вы писали:

_>Привет всем!

_>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы. Возможно вложение (BasicObject отец А, А отец В и тд...)То есть имеем примерно такой код:

_>CODE....


_>Возможно ли реализовать respondsToSelector и performSelector?

_> С надежной на мощь С++ и человеческого разума Сергей.


Чето я не понял фишки , все тут писали такие страшные вещи, хотя все на самом деле очень просто — dynamic_cast, читайте стандарт Microsoft C++
Мы — маньяки, должны помогать друг другу!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.