Привет всем!
Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы. Возможно вложение (BasicObject отец А, А отец В и тд...)То есть имеем примерно такой код:
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"
}
Здравствуйте, last_nefelim, Вы писали:
_>Привет всем! _>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы.
[]
Неоднократно обсуждавшийся вопрос.
Да вот хотя бы 19.08 — посмотри там. _> С надежной на мощь С++ и человеческого разума Сергей.
Да вот и Герба Саттера похожая задача была. На сайте GotW — задача 71.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, last_nefelim, Вы писали:
A>То что ты хочешь очень уж сильно напоминает СОМ....
Я портирую програму с ObjectivC, а там используеться такой вызов функций , вот этим и обусловлен вопрос...
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, last_nefelim, Вы писали:
_>>Привет всем! _>>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы. LVV>[] LVV>Неоднократно обсуждавшийся вопрос. LVV>Да вот хотя бы 19.08 — посмотри там. _>> С надежной на мощь С++ и человеческого разума Сергей. LVV>Да вот и Герба Саттера похожая задача была. На сайте GotW — задача 71.
Здравствуйте, last_nefelim, Вы писали:
_>Здравствуйте, adontz, Вы писали:
A>>Здравствуйте, last_nefelim, Вы писали:
A>>То что ты хочешь очень уж сильно напоминает СОМ.... _>Я портирую програму с ObjectivC, а там используеться такой вызов функций , вот этим и обусловлен вопрос...
Тебе нужно пересмотреть объектную модель. У ObjC с C++ большие различия в этом смысле. Прямого перевода на C++ все равно нет.
Здравствуйте, 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);
}
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, last_nefelim, Вы писали:
_>>Привет всем! _>>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы. LVV>[] LVV>Неоднократно обсуждавшийся вопрос. LVV>Да вот хотя бы 19.08 — посмотри там. _>> С надежной на мощь С++ и человеческого разума Сергей. LVV>Да вот и Герба Саттера похожая задача была. На сайте GotW — задача 71.
Прикольно конечно, много нового узнал (по английскому языку ), но! я не могу сделать общий тэмплейт для всей иерархии класов (слишком много функций). Или же я что-то не понял? ?
Здравствуйте, last_nefelim, Вы писали:
_>Привет всем! _>Есть такая задача (возможно не выполнимая): есть куча класов имеющих одного общего предка (BasicObject), известны имена виртуальных фунций (aSelector), надо узнать есть ли такая виртуальная функция в даном классе (respondsToSelector) и если есть, то вызвать её (performSelector) с возвратом результата работы. Возможно вложение (BasicObject отец А, А отец В и тд...)То есть имеем примерно такой код:
_>CODE....
_>Возможно ли реализовать respondsToSelector и performSelector? _> С надежной на мощь С++ и человеческого разума Сергей.
Чето я не понял фишки , все тут писали такие страшные вещи, хотя все на самом деле очень просто — dynamic_cast, читайте стандарт Microsoft C++