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

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

Войти
Регистрация
Восстановить пароль
 
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
#1

Вызов функции по указателю из класса - C++

11.11.2013, 15:55. Просмотров 757. Ответов 14
Метки нет (Все метки)

Такой расклад. Допустим имеем код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
template <class _Tp>
class my_mem_fun_t
{
private:
  void (_Tp::*_M_f)();
public:
explicit
  my_mem_fun_t(void (_Tp::*__pf)())
  : _M_f(__pf) {}
 
  void
  operator()(_Tp* __p) const
  { (__p->*_M_f)(); }
 
};
class A
{
public:
    void blamba()
    {
        cout << "Ok" << endl;
    }
};
int main()
{
    A a;
    my_mem_fun_t<A> data(&A::blamba);
    data(&a);
 
    return 0;
}

Вопрос. Почему нельзя обратится к указателю на функцию без использования синтаксиса (*func), а посредством просто func:
C++
1
2
3
  void
  operator()(_Tp* __p) const
  { __p->_M_f(); }
Здесь компиллятор ищет функцию _M_f в классе А вместо того чтобы использовать указатель.
Возможно я что-то непонимаю, хотя с указателями на функции уже приходилось сталкиваться...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2013, 15:55     Вызов функции по указателю из класса
Посмотрите здесь:

Вызов виртуальной функции по указателю - C++
Суть в том, что преподаватель дал задание на защиту курсовой: вызов по указателю виртуальной функции из ТВР, искал в интернете, наткнулся...

Вызов виртуальной функции по нулевому указателю - C++
struct A { int sum1(int a, int b) { return a+b; } virtual int sum2(int a, int b) { return a+b; } }; int main() { ...

Вызов функции из класса - C++
есть функция объявленная в классе Calendar void calendar::menu_k() { cout&lt;&lt;&quot;\n\n&quot;; set_color(cGREEN); cout&lt;&lt;&quot;МЕНЮ&quot;&lt;&lt;endl; ...

Вызов функции класса по каллбеку - C++
Хочу реализовать возможность вызова метода класса по каллбеку. Сделал такой класс: class ICallable { public: ICallable ();...

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

Вызов функции вне класса - C++
Есть класс, в нем два метода. В одном из них надо вызвать функцию, которая расположена вне класса. Как зделать?? Можете на примере...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
11.11.2013, 16:00
  #2

Не по теме:

Ilot, что за извращения?

Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
11.11.2013, 16:01  [ТС]     Вызов функции по указателю из класса #3
Цитата Сообщение от metaluga145 Посмотреть сообщение

Не по теме:

Ilot, что за извращения?

Это STL .
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.11.2013, 16:04     Вызов функции по указателю из класса #4
Цитата Сообщение от Ilot Посмотреть сообщение
Это STL
где там такое есть?
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.11.2013, 08:44  [ТС]     Вызов функции по указателю из класса #5
Смотрите в заголовочнике функций. Как пример:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  template <class _Ret, class _Tp>
    class mem_fun_t : public unary_function<_Tp*, _Ret>
    {
    public:
      explicit
      mem_fun_t(_Ret (_Tp::*__pf)())
      : _M_f(__pf) {}
 
      _Ret
      operator()(_Tp* __p) const
      { return (__p->*_M_f)(); }
    private:
      _Ret (_Tp::*_M_f)();
    };


Добавлено через 15 часов 53 минуты
Актуально...
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.11.2013, 09:00     Вызов функции по указателю из класса #6
Цитата Сообщение от Ilot Посмотреть сообщение
без использования синтаксиса (*func)
Не совсем понимаю вопрос, но синтаксис не (*func), а (->*func)

А так это потому что приоритет оператора ( ) выше чем оператора ->*, поэтому приходится брать в скобки выражение "указатель ->* указатель_на_метод"

Добавлено через 1 минуту
C++
1
2
3
  void
  operator()(_Tp* __p) const
  { __p->_M_f(); }
Для вызова функций членов класса используется оператор ->*, а не ->
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.11.2013, 09:22  [ТС]     Вызов функции по указателю из класса #7
Вопрос в следующем. Как известно синтаксис для вызова функции через указатель вида (*func) и func эквивалентны. Поэтому вопрос почему в синтаксисе:
C++
1
2
3
void
operator()(_Tp* __p) const
{ __p->_M_f(); }
вызывается метод _M_f класса _Tp, а не функция на которою указывает указатель _M_f?

Добавлено через 13 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Для вызова функций членов класса используется оператор ->*, а не ->
Если добавить в класс метод _M_f, то конструкция:
C++
1
2
3
  void
  operator()(_Tp* __p) const
  { (__p->_M_f)(); }
вызовет его. А конструкция:
C++
1
2
3
  void
  operator()(_Tp* __p) const
  { (__p->*_M_f)(); }
Вызовет функцию на которуюю указывает указатель.
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.11.2013, 09:24     Вызов функции по указателю из класса #8
Потому что это:
C++
1
__p->_M_f();
вызов функции-члена. Так же как и для косвенного обращения к другим членам класса используется селектор "->"
Цитата Сообщение от Ilot Посмотреть сообщение
а не функция на которою указывает указатель _M_f?
Это указатель на функцию-член класса. Для вызова данной функции нужен объект (его адрес у нас находится в __p) и сам указатель на функцию-член. Для вызова функции-члена по указателю на на функцию-член класса нужно использовать селектор "->*"

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Если добавить в класс метод _M_f
то не скомпилируется же

P.S. "->*" - это один оператор, а не два "->" и "*"
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.11.2013, 09:35  [ТС]     Вызов функции по указателю из класса #9
Цитата Сообщение от Croessmah Посмотреть сообщение
...не скомпилируется же
Но как же:
Кликните здесь для просмотра всего текста
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
41
#include <iostream>
using namespace std;
 
template <class _Tp>
class my_mem_fun_t
{
private:
  void (_Tp::*_M_f)();
public:
explicit
  my_mem_fun_t(void (_Tp::*__pf)())
  : _M_f(__pf) {}
 
  void
  operator()(_Tp* __p) const
  {
    (__p->*_M_f)();//Вызов blamba
    (__p->_M_f)(); //Вызов _M_f
  }
 
};
class A
{
public:
    void _M_f()
    {
        cout << "_M_f" << endl;
    }
    void blamba()
    {
        cout << "blamba" << endl;
    }
};
int main()
{
    A a;
    my_mem_fun_t<A> data(&A::blamba);
    data(&a);
 
    return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.11.2013, 09:40     Вызов функции по указателю из класса #10
Цитата Сообщение от Ilot Посмотреть сообщение
Но как же:
Это меня переклинило, что функция _M_f находится будет в одном классе с указателем my_mem_fun_t

Цитата Сообщение от Ilot Посмотреть сообщение
Но почему компллятор не видет объявленный в классе указатель
Всё он видит, но повторю еще раз, что ДЛЯ ВЫЗОВА ФУНКЦИИ-ЧЛЕНА ЧЕРЕЗ УКАЗАТЕЛЬ НА НЕЕ ИСПОЛЬЗУЕТСЯ СЕЛЕКТОР "->*", А НЕ "->"

И в вашем же коде это видно:
C++
1
2
    (__p->*_M_f)();//Это вызов функции по укзателю на функцию-член, используется ->*
    (__p->_M_f)(); //Вызов функции члена _M_f, используется селектор ->
metaluga145
12.11.2013, 10:09
  #11

Не по теме:

Croessmah, что можно почитать, чтобы хорошо понимать что тут вообще происходит? А то интересно, но как-то сложно дается.

Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.11.2013, 10:12  [ТС]     Вызов функции по указателю из класса #12
Ладно придется смириться. Я понял так, что тот синтаксис который возможен для функция не возможен для методов класса в силу того, что это приведет к неоднозначности.
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.11.2013, 10:19     Вызов функции по указателю из класса #13
Цитата Сообщение от metaluga145 Посмотреть сообщение
что можно почитать, чтобы хорошо понимать что тут вообще происходит? А то интересно, но как-то сложно дается.
шаблоны освоить и указатели на функции и функции-члены класса
Ilot
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.11.2013, 10:22  [ТС]     Вызов функции по указателю из класса #14
Цитата Сообщение от metaluga145 Посмотреть сообщение

Не по теме:

Croessmah, что можно почитать, чтобы хорошо понимать что тут вообще происходит? А то интересно, но как-то сложно дается.

Пусть вопрос адресован не мне возьму на себя смелость ответить:
Сперва Прата Язык программисрования С++
Далее Мюссер Справочник по STL или Джосъютис С++. Стандарная библиотека
И самое главное изучайте заголовочные файлы. Там есть очень много того чего нет в книгах.
Да и по мне хороших книг начального уровня по шаблонам пока не встрчал, а изучение заголовочников STL помогает с ними разобраться... более менее.
Croessmah, моя вам благодарность за отзывчивость.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2013, 10:26     Вызов функции по указателю из класса
Еще ссылки по теме:

Бинарное дерево подклассов основного класса-узла. Доступ к подклассам по указателю - объекту класса-родителя - C++
Короче, необходимо сделать бинарное дерево, решающее арифметическое выражение, предварительно туда записанное. Есть основной класс...

Вызов глобальной функции из объекта класса - C++
Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод который &quot;запустит&quot; эту...

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

Вызов функции класса. Чего-то не допонял - C++
1&gt;d:\с++ файл\1.5.1\1.5.1\1.5.1.cpp(136): error C2352: Man::ChangeName: недопустимый вызов нестатической функции-члена 1&gt; d:\с++...

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


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.11.2013, 10:26     Вызов функции по указателю из класса #15
Цитата Сообщение от Ilot Посмотреть сообщение
Да и по мне хороших книг начального уровня по шаблонам
Солтер Н.А., Клепер С.Дж. - "С++ для профессионалов"
достаточно хорошо описываются шаблоны (правда не всё что с ними связано, но достаточно чтобы не путаться в них и самому стряпать сложные конструкции)
Yandex
Объявления
12.11.2013, 10:26     Вызов функции по указателю из класса
Ответ Создать тему
Опции темы

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