Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
porshe
52 / 46 / 42
Регистрация: 18.07.2014
Сообщений: 194
1

Функция, получающая указатель на обычную функцию, получает указатель на метод класса

03.11.2014, 20:07. Просмотров 789. Ответов 4
Метки нет (Все метки)

Здравтсвуйте.
Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и запускает функцию через этот указатель. Есть класс, у которого есть метод. Этот метод я буду передовать в f. Этот метод должен изменять содержимое объекта, но так как f принимает указатель на обычную функцию, то, естественно, ничего не меняется( я вообще если честно не понимаю, почем программа не "падает" ведь метод должен менять значение члена объекта, но указатель this не передан, то есть метод, вызван как статический, хотя он ни капельки не статический ). Думаю, что я выразился косоязычно, поэтому привожу пример:

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
#include <iostream>
 
void start( void(*pfunc)() )
{
    (*pfunc)();
}
 
class C
{
public:
    C(): i(0) {}
    void myfunc()
    {
        std::cout << "C::myfunc()\n";
        i++;
    }
    int i;
};
 
int main()
{
    C obj;
    std::cout << obj.i << std::endl;
    void (C::*func)();
    func = &C::myfunc;
    start( reinterpret_cast<void(*)()>(func) );
    std::cout << obj.i << std::endl; //Здесь я хочу увидеть "1", но этот оператор вообще ничего не выводит
    return 0;
}
Как быть? И что делать с варнингами:
Код
/home/roma/Desktop/GameOfLife/GameOfLife/main.cpp:26: warning: converting from 'void (C::*)()' to 'void (*)()' [-Wpmf-conversions]
     start( reinterpret_cast<void(*)()>(func) );
                                            ^
прислушиваться к ним или "не видеть"?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2014, 20:07
Ответы с готовыми решениями:

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void...

Функция, получающая подстроку, возвращает испорченный указатель на строку
Пытаюсь выделить подстроку в Microsoft Visual C++ 2013, чтобы убрать путь к...

Как передать указатель на функцию через метод класса ?
typedef void (*FuncCallback)(float* flValue); Пробовал по всякому и ни как:...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось...

Как передать в метод класса Menu указатель на метод дочернего класса?
Как передать в метод базового класса указатель на метод дочернего: class...

4
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.11.2014, 20:21 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
#include <iostream>
 
class C;
 
void start( void(C::*pfunc)(), C& c )
{
   (c.*pfunc)();
}
 
class C
{
public:
   C(): i(0) {}
   void myfunc()
   {
      std::cout << "C::myfunc()\n";
      i++;
   }
   int i;
};
 
int main()
{
   C obj;
   std::cout << obj.i << std::endl;
   void (C::*func)();
   func = &C::myfunc;
   start( func, obj );
   std::cout << obj.i << std::endl;
   return 0;
}
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4838 / 2483 / 695
Регистрация: 18.10.2014
Сообщений: 4,290
03.11.2014, 20:48 3
Лучший ответ Сообщение было отмечено porshe как решение

Решение

Цитата Сообщение от porshe Посмотреть сообщение
я вообще если честно не понимаю, почем программа не "падает"
Ваша код бессмысленен. Указатель на обычную функцию и указатель на метод класса - это объекты совершенно разной природы. В вашу функцию 'start' невозможно передать указатель на метод класса. А то, что вы его туда силой "вбили" через 'reinterpret_cast' приводит только к неопределенному поведению. Заниматься каким-то анализом этого кода на тему "чего и почему" - пустая трата времени.

Я не знаю, в чем состоит задача, но если вам нужно "свести вместе" указатели на обычные функции и указатели на методы классов, то сделать это на уровне языкового ядра (core C++ language) не получится. Надо переходить к функциональным объектам и либо делать вашу функцию шаблонной, либо работать через std::function.

Добавлено через 11 минут
К примеру

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
#include <functional>
#include <iostream>
 
void start(const std::function<void ()>& f)
{
  f();
}
 
class C
{
public:
  C() : i(0) {}
  void myfunc()
  {
    std::cout << "C::myfunc()" << std::endl;
    i++;
  }
  int i;
};
 
int main()
{
  C obj;
  std::cout << obj.i << std::endl;
  std::function<void()> f = std::bind(&C::myfunc, &obj);
  start(f);
  std::cout << obj.i << std::endl;
}
1
porshe
52 / 46 / 42
Регистрация: 18.07.2014
Сообщений: 194
03.11.2014, 20:53  [ТС] 4
Большое спасибо
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.11.2014, 21:01 5
Я б через шаблон все же делал:
C++
1
2
template <typename F>
void start(F&& f) { f(); }
и вызов:
C++
1
start(std::bind(std::mem_fn(&C::myfunc), &obj));
1
03.11.2014, 21:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2014, 21:01

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

Функция принимает указатель на void и возвращает указатель на int
Запишите прототип функции, которая принимает указатель на void и возвращает...

Деревья С++ (функция, которая получает указатель на корень дерева и возвращает длину самой длинной ветки на дереве)
Здравствуйте! Помогите, пожалуйста, в написании функции ,которая получает...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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