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

Как вызвать функцию через указатель? - C++

Восстановить пароль Регистрация
 
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
28.12.2013, 09:07     Как вызвать функцию через указатель? #1
Добрый день. Всех с наступающим))Здоровье Счастье и бабок)))
Подскажите как правильно сделать
Тестовый рабочий пример
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
42
struct AmiVar
{
        .......
    double rez;
};
AmiVar Квадрат(int i, int j){
    AmiVar qqq;
    qqq.rez = i*j;
    return qqq;
}
AmiVar Дробь(int i, int j) {
    AmiVar qqq;
    qqq.rez = (double)i/j;
    return qqq;
}
 
AmiVar(*myFunc)(int, int);
 
    int main(array<System::String ^> ^args)
{
    myFunc = &Квадрат;
    AmiVar q = myFunc(20, 5);
    myFunc = &Дробь;
    AmiVar q1 = myFunc(20, 33);
}
Все работает
----------------------
Пытаюсь тоже самое повторить в classe не получается
class A{
   .......
AmiVar (*pCross)(int, int);
// сами функции
AmiVar CrossUp(int i, int imas) {}
AmiVar CrossDn(int i, int imas) {}
 
// Функция инициализации вызова и тетта
void Inizial() {
      pCross=&CrossUp; // ошибка С2276
      pCross=&A::CrossUp; // ошибка С2240
 
}
}
Подскажите пожалуйста как сделать правильно?
С уважением, Александр
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2013, 09:07     Как вызвать функцию через указатель?
Посмотрите здесь:

Не могу вызвать функцию через указатель C++
C++ В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
C++ Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать?
C++ Как вызвать функцию через указатель?
C++ Как передать указатель на функцию через метод класса ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 09:42     Как вызвать функцию через указатель? #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
 AmiVar (A::*pCross)(int, int);
 // сами функции
 AmiVar CrossUp(int i, int imas) {}
 AmiVar CrossDn(int i, int imas) {}
 
 // Функция инициализации вызова и тетта
void Inizial() 
{
    pCross = &A::CrossUp;
}
};
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
28.12.2013, 09:52  [ТС]     Как вызвать функцию через указатель? #3
Огромное спасибо )))!!!! два для мучился(((
А тут так все просто!!!
Профи !!!!
Спасибо)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.12.2013, 10:14     Как вызвать функцию через указатель? #4
Вызов:
C++
1
2
3
4
5
6
7
8
 // Функция инициализации вызова и тетта
void Inizial() 
{
    pCross = &A::CrossUp;
    AmiVar q = (this ->*pCross)(5, 5);
    pCross = &A::CrossDn;
    AmiVar q1 = (this ->*pCross)(-5, -5);
}
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
28.12.2013, 10:21  [ТС]     Как вызвать функцию через указатель? #5
Спасибо))
Красивый код))))
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
11.01.2014, 16:06  [ТС]     Как вызвать функцию через указатель? #6
Добрый день )))
Спасибо за пример, все работает великолепно.
Но программа быстро разрастается и требует новых решений ...

Задача такая- функции находятся находится в классе А.
В классе B из массива вызываются данные функции по адресам записанные в массив
В классе С записывают адреса вызываемых функций.

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
typedef AmiVar (A::*pCross)(int, int);
struct МаssAdres 
{
    int  i;
    pCross _pCross;
};
class A
{
 
 // сами функции
 AmiVar CrossUp(int i, int imas) {}
 AmiVar CrossDn(int i, int imas) {}
 
};
 
class B
{
    МаssAdres  _masAdres[10]; 
 
    void ВызовФункции_по_Адресу(i)
    {
      this->*_masAdres[i]._pCross(5,5);
    }
 
}
 
class C 
{  
    void АдресФункции()
    {
       МаssAdres  C_masAdres;
       C_masAdres.i=1;
       C_masAdres._pCross=&A:: CrossUp;
// потом передать в класс B
     }
}
Все классы находятся в разных файлах.h

Начинает ругаться на->>> typedef AmiVar (A::*pCross)(int, int);
error C2645: нет полного имени для указателя на член (имеется ":: *')

Подскажите пожалуйста.
С уважением, Александр
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
11.01.2014, 16:21     Как вызвать функцию через указатель? #7
может потому что A определен ниже тайпдефа, для которого требуется определение А

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// плохо. А определен ниже этого тайпдефа.
//typedef void (A::*MemFunPtr)();
 
class A
{
public:
  void Foo()
  {
  }
};
 
// хорошо. В этой точке А определен.
typedef void (A::*MemFunPtr)();
 
int main()
{
  return 0;
}
похоже для этих дел достаточно форвард декларации:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A;
 
typedef void (A::*MemFunPtr)();
 
class A
{
public:
  void Foo()
  {
  }
};
 
int main()
{
  return 0;
}
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
11.01.2014, 16:26  [ТС]     Как вызвать функцию через указатель? #8
Цитата Сообщение от DU Посмотреть сообщение
может потому что A определен ниже тайпдефа, для которого требуется определение А
У меня в начале файла стоит ссылка
#include "файл.h"
где описывается класс А

а затем тайпдефа )))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.01.2014, 19:19     Как вызвать функцию через указатель? #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct МаssAdres 
{
    int  i;
    pCross _pCross;
};
 
class B
{
    МаssAdres  _masAdres[10]; 
 
    void ВызовФункции_по_Адресу(i)
    {
      this->*_masAdres[i]._pCross(5,5);
    }
 
}
Это всё не то. Чтобы вызвать метод класса по указателю: во-первых, этот указатель должнет быть инициализирован адресом конкретного метода класса, во-вторых, для вызова этого метода (с помощью указателя на метод) нужен или объект класса (в данном случае, A), или указатель на такой объект.
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
11.01.2014, 21:02  [ТС]     Как вызвать функцию через указатель? #10
Спасибо )))
Сделал class A - базовым для всех и компилятор перестал ругаться.
Новые class получают (если нужно) класс А и прописывают вызов процедур...

Уважаемый))))
А если этот вызов реализовать через delegat - насколько замедляется вычисления.
Для меня скорость критична.
Сами delegat-ы маленькие вот к примеру

C++
1
2
3
4
5
6
7
8
9
RezPeres CrossUp(int i, int imas){
    RezPeres xP1;
    xP1 = { false, 0 };
    if (sa.Close[i - 1] >= (float)  MasStopS[imas]._stop->array[i - 1])  
                   xP1 = { true, 1 };
    if (sa.High[i] >= (float) MasStopS[imas]._stop->array[i] + MasStopS[imas].porog)    
                   { xP1.log = true; xP1.logKod += 2; }
    return xP1;
    }
Но массив 3-5 тыс значений на одном значении массива (i) функция вызванивается примерно 20-30 раз
цикл запускается каждую секунду.
Сейчас я прописываю адреса подпрограмм в массив и в цикле вызываю их.
Если эту часть переделать на делегаты, как вы думаете, намного медленный будет работать программа?
C уважением, Александр.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2014, 23:30     Как вызвать функцию через указатель?
Еще ссылки по теме:

Как создать указатель на функцию-член класса и вызвать его? C++
C++ Как вызвать функцию, описанную в DLL через Custom Action в wix?
C++ Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)

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

Или воспользуйтесь поиском по форуму:
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 131
11.01.2014, 23:30  [ТС]     Как вызвать функцию через указатель? #11
Спасибо "UI; Сегодня в 22:15." - за "хороший емкий" ответ
Вы не владеете вопросом?
Мне его нужно было задать в ветке C++ для экспертов ?
Yandex
Объявления
11.01.2014, 23:30     Как вызвать функцию через указатель?
Ответ Создать тему
Опции темы

Текущее время: 07:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru