Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача методу класса указателя на методо другого класса.

279
06 февраля 2006 года
bave
456 / / 07.03.2004
Мне нужно в метод класса 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
---------------------------------------------
Что не так?
3
06 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by bave

Что не так?


Добавь скобки:
(temp_methods->*pGenTexFunc)(pbmfs);

Объясни, плз, зачем делаешь так много действий в описанном методе?
Ведь можно сделать так:

 
Код:
GLvoid GLRENDER::GenTexFunc( PBITMAP_FILE_S pbmfs,
                             void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S) )
{
    DataLoader dataLoader;
    (dataLoader.*pGenTexFunc)(pbmfs);
}
279
06 февраля 2006 года
bave
456 / / 07.03.2004
Спасибо, заработало.
--------------------------------------------------
Что касается кода выше:
ну, дело в том что у меня код этого метода был не такой как я его здесь написал,
а на самом деле всё так:

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.: Это у меня привычка от другого форума осталась -
я там вопрос как ни задам, меня в ответ возьмут и другими
воросами завалят :)
------------------------------------------------------------------------------
398
06 февраля 2006 года
Alexandoros
630 / / 21.10.2005
А можно пару вопросов? В чем собственно прикол передачи одному класу метода другого класа? А если б другой метод юзал внутренние переменные того класа?
3
07 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Alexandoros
В чем собственно прикол передачи одному класу метода другого класа?


Вопрос понимать как "для чего можно использовать передачу указателя на метод" ?
Ответ: смотри паттерны "Команда", "Стратегия", "Наблюдатель", "Посетитель" и пр.
http://ooad.asf.ru/Patterns/

Цитата:
Originally posted by Alexandoros

А если б другой метод юзал внутренние переменные того класа?


Вопрос непонятен.

398
09 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by Green
Ответ: смотри паттерны "Команда", "Стратегия", "Наблюдатель", "Посетитель" и пр.
http://ooad.asf.ru/Patterns/



Посмотрел команду и наблюдателя, передач указателей на ф-ции ненашел :(.

Вопрос открыт.
Вот bave например. Что тебе мешало написать

 
Код:
GLvoid GLRENDER::GenTexFunc( PBITMAP_FILE_S pbmfs)//,void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S) )

{
pLoader->GenTexFunc(pbmfs);
}


Ведь, pLoader - это указатель на обджект класа DataLoader ??

Green ты хоть в 2х словах расскажи.

По поводу
Цитата:
А если б другой метод юзал внутренние переменные того класа?



Я имел в виду такую ситуацию, допустим

Код:
class CA
{
   int A;
public:
   int GetA(){return A;}
}

class CB
{  
   int A;

public:

   GetA(int(CA::*pGetA)())
    {
      this->*pGetA();  // Здесь матов по поводу доступу к закрытой переменной не будет?
    }

}


Но здесь я сначала подумал - что это извратная метода такая - юзать чужие методы в своем класе, без реализации последних. Но скорее всего я ошибся. :)
3
10 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Alexandoros
Посмотрел команду и наблюдателя, передач указателей на ф-ции ненашел :(.

Вопрос открыт.


Так там их и нет в явном виде, т.к. это уже реализация, а там описаны принципы.

Цитата:
Originally posted by Alexandoros
Вот bave например. Что тебе мешало написать
 
Код:
GLvoid GLRENDER::GenTexFunc( PBITMAP_FILE_S pbmfs)//,void (DataLoader:: *pGenTexFunc)(PBITMAP_FILE_S) )

{
pLoader->GenTexFunc(pbmfs);
}


Ведь, pLoader - это указатель на обджект класа DataLoader ??

Green ты хоть в 2х словах расскажи.


Ты не понял мысли.
Передавая указатель на метод ты задаешь поведение, а не данные.
Ты когда-нибудь пользовался callback-ами?
Ну хотя бы callback обычного окна. Окно само по себе стандартно, но вот реакция окна должна быть различной в зависимости от его применения.

При передаче указателя на метод все аналогично.
Принимающий указатель код не знает изначально какой метод вызывать, ему его передают в качестве указателя.

Вот смотри упрощенный пример:

Код:
struct A
{
   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), ну т.д.

Цитата:
Originally posted by Alexandoros
По поводу


Я имел в виду такую ситуацию, допустим

Код:
class CA
{
   int A;
public:
   int GetA(){return A;}
}

class CB
{  
   int A;

public:

   GetA(int(CA::*pGetA)())
    {
      this->*pGetA();  // Здесь матов по поводу доступу к закрытой переменной не будет?
    }

}


Но здесь я сначала подумал - что это извратная метода такая - юзать чужие методы в своем класе, без реализации последних. Но скорее всего я ошибся. :)


Да, ты ошибся.
Методы вызываем у экземпляра класса которому они принадлежат, чужие нельзя.

398
11 февраля 2006 года
Alexandoros
630 / / 21.10.2005
BioUnit спасиба. Разобрался.
Это новая форма передачи масива указателей на ф-ции. Типа
 
Код:
HandlersArray[GetCommandFromUser()];


HandlersArray - масив указателей на ф-ции, выполняющих обработку команды. Это я так, для закрепления материала:)
14K
14 февраля 2006 года
AndreasDrummer
8 / / 03.01.2006
Цитата:
Originally posted by bave
Мне нужно в метод класса 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); - должно работать. Хотя возможно я ошибаюсь, ну попробуй!!

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreasDrummer
Кстати если верить Страуструпу))), то применение разыменования у казателю на функцию можно опустить.
(temp_methods->pGenTexFunc)(pbmfs); - должно работать. Хотя возможно я ошибаюсь, ну попробуй!!


Где ты такое у Страуструпа вычитал? :D

14K
14 февраля 2006 года
AndreasDrummer
8 / / 03.01.2006
Цитата:
Originally posted by Green
Где ты такое у Страуструпа вычитал? :D



Страуструп, 3 издание специальное издание, рус.
стр. 199
7.7 Указатель на функцию

строка от начала раздела - 15.
Единственное что, что не уверен с передачей в качестве аргумента объекта и вызова для него метода через указатель. Там рассматривается вариант вызова именно функции.

Посмеемся вместе? )))))

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreasDrummer
Страуструп, 3 издание специальное издание, рус.
стр. 199
7.7 Указатель на функцию

строка от начала раздела - 15.
Единственное что, что не уверен с передачей в качестве аргумента объекта и вызова для него метода через указатель. Там рассматривается вариант вызова именно функции.

Посмеемся вместе? )))))


Посмеемся.
"Указатель на функцию" - это совершенно из другой оперы.
Помнишь анекдот про Ржевского: "Плывет клипер, на клипере шкипер, у шкипера трипер" ?

14K
14 февраля 2006 года
AndreasDrummer
8 / / 03.01.2006
Цитата:
Originally posted by Green
Посмеемся.
"Указатель на функцию" - это совершенно из другой оперы.
Помнишь анекдот про Ржевского: "Плывет клипер, на клипере шкипер, у шкипера трипер" ?



Нет, расскажи...)))

Да я в общем-то не говорил, что я прав...специально написал, что могу ошибаться...а судя по количеству твоих постов против моих я как бы еще очень зеленый...но тему проанализирую...я пока достаточно еще новичок в этом мире.

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by AndreasDrummer
Нет, расскажи...)))


Ржевский собирается на балл. Спрашивает у деньщика:
- Расскажи мне какай-нибудь каламбур, чтоб я мог блестнуть остроумием на балу!
- Вот свежий каламбур: плывет клипер, на клипере шкипер, у шкипере трипер.

Ржевский на балллу:
- Плывет баржа, на ней куча народу и у всех сифилис!

Цитата:
Originally posted by AndreasDrummer

Да я в общем-то не говорил, что я прав...специально написал, что могу ошибаться...а судя по количеству твоих постов против моих я как бы еще очень зеленый...но тему проанализирую...я пока достаточно еще новичок в этом мире.


То что написано в 7.7 касается только функций, но никак не методов класса. Разница большая.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог