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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
ai.xss.ru
9 / 9 / 0
Регистрация: 08.07.2010
Сообщений: 70
#1

Указатель на функцию - C++

09.07.2010, 11:52. Просмотров 1102. Ответов 7
Метки нет (Все метки)

Всем привет!
Компилятор выдает ошибку при использовании указателя на функцию. Задача такая
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
FileName.h
.......................................................
Class1
{
....................
 void Func1(double (*)(double*));
.................................
};
class2 : public class1
{
..................................
 double Func2(double *);
 void Func3();
...................................
};
/////////////////////////////////////////////
FileName.cpp
void Class1::Func1(double (*pFunc2)(double *dW))
{
 double d = pFunc2(dW)
...............................................................
}
 
double Class2::Func2(double *dW)
{
.........................................
}
 
void Class2::Func3()
{
  Func1(&Func2); //error C2276: '&' : illegal operation on bound member function expression
  Func2(Func1); //error C3867: '': function call missing argument list; use '&::' to create a pointer to member
}
Как победить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2010, 11:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на функцию (C++):

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

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

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

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

Передать в неуправляемую функцию указатель на указатель - C++
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
09.07.2010, 12:21 #2
Короч правильно вот так делать:
C++
1
2
3
4
5
void Class2::Func3()
{
    Func1(&Class2::Func2);
    Func2(&Class1::Func1); 
}
Но у вас все равно как-то все запутано и не компилится.

Добавлено через 9 минут
Простейший подобный пример, который я смог скомпилить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct st
{
    static double p()
    {
        return 0;
    }
};
 
void f(double p())
{
 
}
 
int main()
{
    f(&st::p);
}
А как обстоят дела с нестатическими методами - не знаю.
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
09.07.2010, 14:32 #3
C++
1
2
3
4
5
void Class2::Func3()
{
  Func1(Func2);   // 
  Func2(Func1); //error C3867: '': function call missing argument list; use '&::' to create a pointer to member
}
Так как имя функции на самом деле — начальный адрес ее кода, то в Func1 нужно передавать просто имя Func2.
C++
1
Func1( Func2 );
А во вторую ф-цию нужно передавать переменную типа double
а Func1 возвращает void
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
09.07.2010, 14:38 #4
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>
 
//-----------------------------------
class ThisClass
{
    public:
        void thisFunc()
        {
            std::cout << "thisFunc()" << std::endl;
        }
        void callFunc( void(ThisClass::*pFunc)() )
        {        
            (this->*pFunc)();
        }
        void execute()
        {
            callFunc(&ThisClass::thisFunc);                 
        }        
};
 
 
////////////////////////////////////////
int main()
{    
    ThisClass ob;
    ob.execute();
    
    return 0;
}
ai.xss.ru
9 / 9 / 0
Регистрация: 08.07.2010
Сообщений: 70
09.07.2010, 15:30  [ТС] #5
Спасибо за ответы, но мне надо несколько не так сделать. Задача вообще такая. Есть функция оптимизации, определенная в первом классе, а есть куча целевых функций, определенных в других классах, унаследованных от первого. Функция оптимизации использует выбранную целевую функцию, т.е. должна принимать в качестве аргумента целевую функцию. Сейчас, пока ошибку не исправил, сделал по тупому - для каждой целевой функции написал свою функцию оптимизации. Но хочется сделать красиво - чтобы функция оптимизации была одна, универсальная. По этому относительно последнего примера хотелось бы сделать примерно так, но не получается:
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
class ThisClass
{
    public:
        
        void callFunc( void(ThisClass::*pFunc)() )
        {        
            (this->*pFunc)();
        }
               
};
 
class Class2 : public ThisClass
{
public:
    void thisFunc()
        {
            //std::cout << "thisFunc()" << std::endl;
        }
    void execute()
        {
            callFunc(&Class2::thisFunc);                 
        } 
 
};
 
 
int  main(int argc, _TCHAR* argv[])
{
     Class2 ob;
    ob.execute();
    
 
    return 0;
}
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
09.07.2010, 16:00 #6
Цитата Сообщение от ai.xss.ru Посмотреть сообщение
Есть функция оптимизации, определенная в первом классе, а есть куча целевых функций, определенных в других классах, унаследованных от первого.
ИМХО сама постановка задачи какая-то странная и противоречащая ООП. Зачем целевые функции находятся в потомках? В чем логика?
Может тут полиморфизм больше подойдет?
Другое дело конечно, если задача - изучить указатели на функции.

Добавлено через 1 минуту
Можно сделать первый класс абстракным, описать в нем функцию оптимизации, объявить в нем же чисто виртуальную целевую функцию, и реализовывать ее в потомках.

Добавлено через 20 минут
Оно, нэ?
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class BaseClass
{
    virtual void targetFunction() = 0;
public:
    void optimizationFunction()
    {
        targetFunction();
    }
};
 
class SonClass1 : public BaseClass
{
    void targetFunction()
    {
        cout << "SonClass1::targetFunction" << endl;
    }
};
 
class SonClass2 : public BaseClass
{
    void targetFunction()
    {
        cout << "SonClass2::targetFunction" << endl;
    }
};
 
int main()
{
    SonClass1 a;
    SonClass2 b;
    a.optimizationFunction();
    b.optimizationFunction();
    getch();
}
И не нужны никакие указатели.
ai.xss.ru
9 / 9 / 0
Регистрация: 08.07.2010
Сообщений: 70
09.07.2010, 16:05  [ТС] #7
Во, оно. Спасибо. Как говорится, извините, что отвлек от важных дел )).
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
10.07.2010, 10:33 #8
Твою задачу нужно реализовывать именно так, как написал Хохол
Через указатели на метод сие не реализуется, потому как в посте #5 в прототипе callFunc у тебя указан указатель на метод класса ThisClass, а на самом деле ты подаёшь указатель на метод другого класса (пусть и производного).

Можно было бы сделать явное приведение указателей (потому как в случае отсутсвия виртуального наследования вроде бы как нинакаих проблем не будет)

C++
1
callFunc((void(ThisClass::*)())&Class2::thisFunc);
но это всё-таки кривой способ
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2010, 10:33
Привет! Вот еще темы с ответами:

Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) - C++
Подскажите как передать указатель на файл в функцию, как вернуть указатель на файл из функции. void Open() // из этой функции вернуть...

Как передать параметр типа "указатель на указатель" в функцию? - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; #include &lt;iomanip&gt; using std::setiosflags; ...

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? - C++
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...

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


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

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

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