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

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

Войти
Регистрация
Восстановить пароль
 
porshe
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
#1

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

03.11.2014, 20:07. Просмотров 711. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция, получающая указатель на обычную функцию, получает указатель на метод класса (C++):

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

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

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

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

Как передать в метод класса Menu указатель на метод дочернего класса? - C++
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: setCallback(*********); //...

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

4
DiffEreD
1441 / 778 / 95
Регистрация: 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Эксперт С++
4309 / 2328 / 576
Регистрация: 18.10.2014
Сообщений: 3,967
03.11.2014, 20:48 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 / 17
Регистрация: 18.07.2014
Сообщений: 194
03.11.2014, 20:53  [ТС] #4
Большое спасибо
0
DiffEreD
1441 / 778 / 95
Регистрация: 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 - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

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

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Указатель на метод класса - C++
Собственно, проблема вот в чем. Есть класс и для него определен метод class ABC ....... public: void paint(.....); ...


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

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

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