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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Ingener74
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 18
#1

Не получается преобразовать типы указателей на функцию - C++

18.03.2012, 08:37. Просмотров 1417. Ответов 6
Метки нет (Все метки)

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

C++
1
typedef void (*pfn_RawMouseOnLeftDown  )( S_Point<float>& A_rPoint );
и обьект этого типа

C++
1
pfn_RawMouseOnLeftDown pfn_1 = nullptr;
также есть класс c функцией OnLeftDown

C++
1
2
3
4
5
6
7
class C_CoordinateTransform
{
public:
        /*конструкторы и бла бла*/
 
    void OnLeftDown( S_Point<float>& A_rPoint );
};
нужно обьекту pfn_1 присвоить указатель на функцию OnLeftDown обьекта класса C_CoordinateTransform как это можно сделать??

пробовал вот так
C++
1
2
void (C_CoordinateTransform::*pfn_OnLeftDown)(S_Point<float>& A_rPoint) = &C_CoordinateTransform::OnLeftDown;
    pfn_RawMouseOnLeftDown pfn_1 = (pfn_RawMouseOnLeftDown)(oCoordinateTransformSystem.*pfn_OnLeftDown);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2012, 08:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается преобразовать типы указателей на функцию (C++):

типы указателей - C++
Помогите понять, что от меня хотят в этом задании: &quot;выбрать данные из памяти с помощью разных типов указателей (float, char)&quot;

типы указателей Подбельский - C++
пример из книжки Подбельского #include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; int main(){ unsigned long L=0x12345678L; char *cp...

Преобразовать с использованием указателей - C++
#include &lt;iostream&gt; #include &lt;string&gt; int main() { std::string first, second; std::cout &lt;&lt; &quot;Enter first month and...

Не могу преобразовать типы - C++
Здравствуйте. Пишу программку в C++ Builder, ну и упёрся. Есть файл с набором значений байт, в 16-тиричной форме, т.е. 00 // 0 01 //...

Как преобразовать типы данных? - C++
есть переменные int var1; int var2; int result; я хотел бы не создавать еще 3 переменных типа double, для операции result =...

Использование указателей. Преобразовать матрицу по правилу - C++
Дана действительная квадратная матрица порядка n. Преобразовать матрицу по правилу: строку с номером n сделать столбцом с номером n, а...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
18.03.2012, 09:07 #2
Вот посмотри, реализовал твою ситуацию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template<class T>
class Point {};
 
class A {
public:
    void func(Point<float> &p){std::cout << "Func" << std::endl;};
};
 
typedef void (A::*fptr)(Point<float> &p);
 
int main()
{
    A a;
    Point<float> p;
    fptr ptr = &A::func;
    (a.*ptr)(p);
 
    return 0;
}
вобщем смысл в том, что нельзя указателю на функцию присвоить адрес функции-члена класса. Обрати внимание как у меня typedef объявлен.
Ingener74
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 18
18.03.2012, 09:13  [ТС] #3
Спасибо что ответили. То что можно сделать указатель на метод класса я знаю, и знаю как, в том то и дело что мне нужно было как раз присвоить указателю на функцию адрес на метод класса, так бы код у меня в программе стал бы проще. Думал может можно как то сделать, а я незнаю поэтому и спросил.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
18.03.2012, 09:33 #4
Если имеется ввиду сделать нечто такое:
C++
1
2
3
typedef void (*fptr)(Point<float> &p);
A a;
fptr ptr = &a.func;
то так сделать неполучится. Дело в том, что функции-члены в действительности располагаются вне класса и первым аргуметом всегда принимают указатель на вызывающий объект (this). О передачи this заботится компилятор. Поэтому нельзя вызвать функцию-член без объекта, соответственно нельзя получить адрес функции-члена конкретного объекта, т.к. невозможно потом его использовать для вызова функции.
Т.е. вот так:
C++
1
2
fptr ptr = &a.func;
ptr(Point<float>());
сделать не получиться.
Ingener74
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 18
18.03.2012, 09:39  [ТС] #5
Вот вот это я и хотел сделать)) Спасибо большое.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
18.03.2012, 09:54 #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
вобщем смысл в том, что нельзя указателю на функцию присвоить адрес функции-члена класса.
только если ф-я-член не статическая.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
template<class T>
class Point {};
 
class A
{
public:
    static void
    func(Point<float> &p){std::cout << "Func" << std::endl;};
};
 
typedef void (*fptr)(Point<float> &p);
 
int
main()
{
    Point<float> p;
    fptr ptr = &A::func; // сгодится
    ptr(p);
    return 0;
}
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
18.03.2012, 09:59 #7
Цитата Сообщение от retmas Посмотреть сообщение
только если ф-я-член не статическая.
Ну да, потому что она не требует this
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 09:59
Привет! Вот еще темы с ответами:

Как правильно преобразовать типы данных? - C++
Возможно я не очень хорошо понимаю С, но случилась такая проблема. Есть прога: unsigned char data; unsigned long var1; float var2; ...

Дан массив из прототипов функций или указателей на функцию, сделать функцию, возвращающую этот массив - C++
Не охота создавать лишнею тему извиняюсь заранее Вопрос такой Можете подсказать есть массив из прототипов функций или...

Ошибка: ни одна из перегрузок не может преобразовать все типы аргументов - C++
#include &quot;stdafx.h&quot; #include &quot;CppUnitTest.h&quot; #include &quot;/My Documents/Visual Studio...

Не получается присвоить значение элементу массива указателей типа char *a[3] - C++
В попытках разобраться с массивами, указателями, массивами указателей и т.п. написал вот такой код: int main() { char *a = {...


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

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

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