Re: как определить хитрый указатель...
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 05.03.02 18:19
Оценка:
Здравствуйте PaNov, Вы писали:

PN>есть:

PN>typedef double (*FuncGetParam)(int i,int j);
PN>// некий класс, содержащий указатель на функцию
PN>class A
PN>{
PN> public :
PN> FuncGetParam func; // указатель на функцию
PN> double getParam(int i, int j);
PN>};

PN>// это произвольный класс

PN>class B
PN>{
PN> public :
PN> double getParam(int i, int j);
PN>};

PN>// это произвольная функция...

PN>double freeGetParam(int i, int j)
PN>{
PN> return 1.0;
PN>}

PN>надо сделать так, чтобы чтобы можно было присвоить указатель на произвольную функцию (совпадающую по передаваемым параметрам и возвращаемому результату), которая может быть как в самом классе "A", в другом классе "B", а может быть и просто отдельной функцией!


PN>{

PN> A a;
PN> B b;
PN> // надо, чтобы все эти варианты могли работать
PN> A.func = a.getParam;
PN> A.func = b.getParam;
PN> A.func = freeGetParam;
PN>}

PN>в С++ Builder это делается определением функции вот таким способом:

PN>typedef double (__closure *FuncGetParam)(int i,int j);
PN>ключевое слово — "__closure"
PN>как такое же сделать в Visual C++ ?????
PN>если стандартными способами это не делается, покажите, как реализовать нестандартными...

Стандартными способами это не делается.

1. Все в порядке для обычных функций и для статических методов классов. Эта техника сработает.
2. Все плохо для нестатических методов классов. В общем случае (описано в Стандарте) вызов нестатического метода через указатель должен осуществляться принепосредственном участии объекта, для которого делается вызов. Обычным приведением типов это делается для случая одиночного наследования (см. http://rsdn.ru/forum/message.asp?mid=24451
Автор: Андрей Тарасевич
Дата: 26.01.02
и вокруг. Ссылку проверить не могу, т.к. сервер еле шевелится.) Как же написано в том сообщении, которое я имею ввиду, ситуация с таким приведением для случая множественного наследования "... не будет работать в ста процентов случаев." (с) Андрей Тарасевич (когда сервак оживет, можно поиск по этой фразе устроить). В этом случае информация о смещении текущей таблицы вирт. функций (в которой находится вызываемый тобой метод) тепряется, и могут быть варианты.

С уважением
Алексей Кирдин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.