Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
2e1553ce
1 / 1 / 1
Регистрация: 16.12.2011
Сообщений: 47
#1

Указатели на функцию, операции .* и ->* - C++

20.01.2012, 22:31. Просмотров 374. Ответов 3
Метки нет (Все метки)

Закомментируйте пожалуйста код в тех местах где пометил , что то запутался.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class A
{
     public:
     void f()
     {
           cout <<"hello";
     }
 
void Call(void(A::*pf)())   //аргумент у функции указатель на функцию?
{
     (*this.*pf)();            //что тут с указателями? =\
}
 
void ExtCall(A* pa, void(A::*pf()))  // что делает эта функция?
{
     (pa->*pf)();
}
void main()
{
     A a;
     void (A::*pf)()=&A::f(); //и в мейне эту строчку тоже было б супер
     ExtCall(&a,pf);
     a.Call(pf);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2012, 22:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели на функцию, операции .* и ->* (C++):

В функцию с переменным числом параметроы передать указатели на функцию - C++
Добрый вечер. По заданию нужно в функцию с переменным числом параметров передать имя функций, которые нужно вызвать. Долго думала,как имея...

[Указатели]Использование операции получения адреса операнда - C++
Здравствуйте! Объясните пожалуйста, почему в пером случае, когда присваиваем указателю p_test адрес переменной test, использование...

Использовать для работы с матрицами указатели и операции вида *p++, p++ - C++
Здравствуйте. снова обращаюсь к вам. Задание такое: Использовать для работы с матрицами указатели и операции вида *p++, p++ и т.д. Матрицы...

Задано число. Разместите в памяти последовательно все его цифры, используя указатели и операции над ними - C++
Задано натуральное число. Разместите в памяти последовательно все его цифры, используя указатели и операции над ними. Может кто помочь в...

Указатели на функцию - C++
1. arcsin(x^3) bool arcs(double *x) { if (*x**x**x&lt;=1 &amp;&amp; *x**x**x&gt;=-1) {*x=asin(*x**x**x); return true;} } правильно я...

Указатели на функцию - C++
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции пользователем. При невозможности...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
20.01.2012, 23:25 #2
И как оно у вас собиралось?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
using namespace std;
 
class A
{
    string str;
public:
    A(string s)
    {
        str = s;
    }
    void f()
    {
        cout << str << endl;
    }
    
    void Call(void(A::*pf)())   //принимает указатель на метод
    {
        (*this.*pf)();            //вызов полученного метода для текущего объекта
    }
};
    
void ExtCall(A* pa, void(A::*pf)())
//тоже самое, только функция не является методом самого класса,
//получает указатель на объект в параметре
{
    (pa->*pf)();
}
int main()
{
    A a("hello");
    A b("world");
    void (A::*pf)()=&A::f; //берем указатель на метод
    a.Call(pf);
    ExtCall(&b,pf);
}
1
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.01.2012, 23:29 #3
вот чуть подробнее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
class A
{
public:
  void f()
  {
    cout <<"hello";
  }
 
  void ExtCall(A* pa, void(A::*pf)())  // что делает эта функция?
  {
    // В функцию передали указатель на объект типа A и указатель
    // на метод этого объекта (pf - имя этого указателя. так же как pa - имя указателя на A). метод имеет сигнатуру
    // void (), т.е. это метод класса A, который не принимает
    // аргументы и возвращает void, т.е. ничего не возвращает.
    //(pa->*pf) - разыменовывание указателя на метод. (pa - указатель на объект типа A)
    //(ra.*pf) - разыменовывание указателя на метод. (ra - ссылка на объекта типа A)
    // скобочки после разыменовывание - это вызов этого метода.
    (pa->*pf)();
  }
 
  // см каментарии выше
  void Call(void(A::*pf)())
  {
    (*this.*pf)();
  }
};
 
void main()
{
  A a;
  // Объявление переменной с именем pf которая имеет тип указателя на метод класса A,
  // Который ничего не принимает и ничего не возвращает.
  void (A::*pf)() = &A::f;
  ExtCall(&a, pf);
  a.Call(pf);
}
1
2e1553ce
1 / 1 / 1
Регистрация: 16.12.2011
Сообщений: 47
20.01.2012, 23:44  [ТС] #4
Спасибо , да это пример с лекций
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2012, 23:44
Привет! Вот еще темы с ответами:

указатели на функцию - C++
Доброго времени суток! Вот читал про указатели на функцию, и столкнулся с такой проблемой... Допустим, есть такой код: #include...

указатели на функцию - C++
помогите пожалуйста решить k!/(1/2+1/3+...+1/(k+1)) используя указатели на функцию вот до чего я дошла #include &quot;stdafx.h&quot; #include...

Ссылки и указатели на функцию - C++
Если передавать значение в функцию через указатель и ссылку,то в обоих случаях передаётся адрес,а не значение? И ещё: int *...

Передача массива в функцию (указатели) - C++
Возникла проблема. Написала программу решение систем линейных уравнений методом Гаусса. В студии 12 года работает правильно, а в 13 нет;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.01.2012, 23:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru