Передача методу класса указателя на методо другого класса.
пытаюсь сделать это так:
GLvoid GLRENDER:: GenTexFunc(PBITMAP_FILE_S pbmfs,
void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S))
{
DataLoader *temp_methods;
temp_methods = new DataLoader;
temp_methods->*pGenTexFunc(pbmfs);
delete temp_methods;
}
Ну и в результате получаю ошибку:
term does not evaluate to a function
---------------------------------------------
Что не так?
Что не так?
Добавь скобки:
(temp_methods->*pGenTexFunc)(pbmfs);
Объясни, плз, зачем делаешь так много действий в описанном методе?
Ведь можно сделать так:
void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S) )
{
DataLoader dataLoader;
(dataLoader.*pGenTexFunc)(pbmfs);
}
--------------------------------------------------
Что касается кода выше:
ну, дело в том что у меня код этого метода был не такой как я его здесь написал,
а на самом деле всё так:
GLvoid GLRENDER::GenTexFunc( PBITMAP_FILE_S pbmfs,
void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S) )
{
(pLoader->*pGenTexFunc)(pbmfs);
}
Просто если бы я так сразу написал, то появились бы
вопросы:
1. А кто такой pLoader, от куда он взялся?
2. А уверен ли я что этот этот укзатель указывает на существующий,
обект класса DataLoader?
Ну и вот я добавил для наглядности temp_methods,
для наглядности тут же создал объект на который он указывает temp_methods = new ...,
ну и удалил в самом методе :)
------------------------------------------------------------------------------
P.S.: Это у меня привычка от другого форума осталась -
я там вопрос как ни задам, меня в ответ возьмут и другими
воросами завалят :)
------------------------------------------------------------------------------
В чем собственно прикол передачи одному класу метода другого класа?
Вопрос понимать как "для чего можно использовать передачу указателя на метод" ?
Ответ: смотри паттерны "Команда", "Стратегия", "Наблюдатель", "Посетитель" и пр.
http://ooad.asf.ru/Patterns/
А если б другой метод юзал внутренние переменные того класа?
Вопрос непонятен.
Ответ: смотри паттерны "Команда", "Стратегия", "Наблюдатель", "Посетитель" и пр.
http://ooad.asf.ru/Patterns/
Посмотрел команду и наблюдателя, передач указателей на ф-ции ненашел :(.
Вопрос открыт.
Вот bave например. Что тебе мешало написать
{
pLoader->GenTexFunc(pbmfs);
}
Ведь, pLoader - это указатель на обджект класа DataLoader ??
Green ты хоть в 2х словах расскажи.
По поводу
Я имел в виду такую ситуацию, допустим
{
int A;
public:
int GetA(){return A;}
}
class CB
{
int A;
public:
GetA(int(CA::*pGetA)())
{
this->*pGetA(); // Здесь матов по поводу доступу к закрытой переменной не будет?
}
}
Но здесь я сначала подумал - что это извратная метода такая - юзать чужие методы в своем класе, без реализации последних. Но скорее всего я ошибся. :)
Посмотрел команду и наблюдателя, передач указателей на ф-ции ненашел :(.
Вопрос открыт.
Так там их и нет в явном виде, т.к. это уже реализация, а там описаны принципы.
Вот bave например. Что тебе мешало написать
{
pLoader->GenTexFunc(pbmfs);
}
Ведь, pLoader - это указатель на обджект класа DataLoader ??
Green ты хоть в 2х словах расскажи.
Ты не понял мысли.
Передавая указатель на метод ты задаешь поведение, а не данные.
Ты когда-нибудь пользовался callback-ами?
Ну хотя бы callback обычного окна. Окно само по себе стандартно, но вот реакция окна должна быть различной в зависимости от его применения.
При передаче указателя на метод все аналогично.
Принимающий указатель код не знает изначально какой метод вызывать, ему его передают в качестве указателя.
Вот смотри упрощенный пример:
{
int b, c;
int get_b() { return b; }
int get_c() { return c; }
};
void printValue( A* pA, int(A::*pMethod)() )
{
cout << (pA->*pMethod)() << endl;
}
int main()
{
A a;
printValue(&a, A::get_b);
printValue(&a, A::get_с);
}
Пример выглядит бессмысленным, но на самом деле вся соль в том, что я могу указать функции printValue как именно обратиться к экземпляру класса A.
Этот механизм можно использовать в реализации выше приведенных паттернах. "Команда" - здесь все предельно ясно сохраняем метод, который надо вызывать (именно как указатель) и параметры вызова. "Обозреватель" - можем задать объекту наблюдения вызвать определенный метод наблюдателя при возникновении определенного события (похоже на обычный callback), ну т.д.
По поводу
Я имел в виду такую ситуацию, допустим
{
int A;
public:
int GetA(){return A;}
}
class CB
{
int A;
public:
GetA(int(CA::*pGetA)())
{
this->*pGetA(); // Здесь матов по поводу доступу к закрытой переменной не будет?
}
}
Но здесь я сначала подумал - что это извратная метода такая - юзать чужие методы в своем класе, без реализации последних. Но скорее всего я ошибся. :)
Да, ты ошибся.
Методы вызываем у экземпляра класса которому они принадлежат, чужие нельзя.
Это новая форма передачи масива указателей на ф-ции. Типа
HandlersArray - масив указателей на ф-ции, выполняющих обработку команды. Это я так, для закрепления материала:)
Мне нужно в метод класса GLRENDER передовать указатель на метод другого класса -
пытаюсь сделать это так:
GLvoid GLRENDER:: GenTexFunc(PBITMAP_FILE_S pbmfs,
void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S))
{
DataLoader *temp_methods;
temp_methods = new DataLoader;
temp_methods->*pGenTexFunc(pbmfs);
delete temp_methods;
}
Ну и в результате получаю ошибку:
term does not evaluate to a function
---------------------------------------------
Что не так?
Кстати если верить Страуструпу))), то применение разыменования у казателю на функцию можно опустить.
(temp_methods->pGenTexFunc)(pbmfs); - должно работать. Хотя возможно я ошибаюсь, ну попробуй!!
Кстати если верить Страуструпу))), то применение разыменования у казателю на функцию можно опустить.
(temp_methods->pGenTexFunc)(pbmfs); - должно работать. Хотя возможно я ошибаюсь, ну попробуй!!
Где ты такое у Страуструпа вычитал? :D
Где ты такое у Страуструпа вычитал? :D
Страуструп, 3 издание специальное издание, рус.
стр. 199
7.7 Указатель на функцию
строка от начала раздела - 15.
Единственное что, что не уверен с передачей в качестве аргумента объекта и вызова для него метода через указатель. Там рассматривается вариант вызова именно функции.
Посмеемся вместе? )))))
Страуструп, 3 издание специальное издание, рус.
стр. 199
7.7 Указатель на функцию
строка от начала раздела - 15.
Единственное что, что не уверен с передачей в качестве аргумента объекта и вызова для него метода через указатель. Там рассматривается вариант вызова именно функции.
Посмеемся вместе? )))))
Посмеемся.
"Указатель на функцию" - это совершенно из другой оперы.
Помнишь анекдот про Ржевского: "Плывет клипер, на клипере шкипер, у шкипера трипер" ?
Посмеемся.
"Указатель на функцию" - это совершенно из другой оперы.
Помнишь анекдот про Ржевского: "Плывет клипер, на клипере шкипер, у шкипера трипер" ?
Нет, расскажи...)))
Да я в общем-то не говорил, что я прав...специально написал, что могу ошибаться...а судя по количеству твоих постов против моих я как бы еще очень зеленый...но тему проанализирую...я пока достаточно еще новичок в этом мире.
Нет, расскажи...)))
Ржевский собирается на балл. Спрашивает у деньщика:
- Расскажи мне какай-нибудь каламбур, чтоб я мог блестнуть остроумием на балу!
- Вот свежий каламбур: плывет клипер, на клипере шкипер, у шкипере трипер.
Ржевский на балллу:
- Плывет баржа, на ней куча народу и у всех сифилис!
Да я в общем-то не говорил, что я прав...специально написал, что могу ошибаться...а судя по количеству твоих постов против моих я как бы еще очень зеленый...но тему проанализирую...я пока достаточно еще новичок в этом мире.
То что написано в 7.7 касается только функций, но никак не методов класса. Разница большая.