2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
1

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

28.12.2013, 09:07. Показов 3935. Ответов 10
Метки нет (Все метки)

Добрый день. Всех с наступающим))Здоровье Счастье и бабок)))
Подскажите как правильно сделать
Тестовый рабочий пример
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
 
}
}
Подскажите пожалуйста как сделать правильно?
С уважением, Александр
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2013, 09:07
Ответы с готовыми решениями:

Как вызвать функцию через указатель?
Привет всем! Помогите пожалуйста! Есть готовая рабочая программа, надо вызвать функцию через...

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

Не могу вызвать функцию через указатель
Есть функция void matrixsqr(int **a, int N, int M) как ее вызвать через указатель на функцию ...

Как создать указатель на функцию-член класса и вызвать его?
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса:...

10
5489 / 4884 / 831
Регистрация: 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;
}
};
2
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
28.12.2013, 09:52  [ТС] 3
Огромное спасибо )))!!!! два для мучился(((
А тут так все просто!!!
Профи !!!!
Спасибо)
0
5489 / 4884 / 831
Регистрация: 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);
}
2
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
28.12.2013, 10:21  [ТС] 5
Спасибо))
Красивый код))))
0
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
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: нет полного имени для указателя на член (имеется ":: *')

Подскажите пожалуйста.
С уважением, Александр
0
DU
1498 / 1144 / 165
Регистрация: 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;
}
0
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
11.01.2014, 16:26  [ТС] 8
Цитата Сообщение от DU Посмотреть сообщение
может потому что A определен ниже тайпдефа, для которого требуется определение А
У меня в начале файла стоит ссылка
#include "файл.h"
где описывается класс А

а затем тайпдефа )))
0
5489 / 4884 / 831
Регистрация: 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), или указатель на такой объект.
1
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
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 уважением, Александр.
0
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 167
11.01.2014, 23:30  [ТС] 11
Спасибо "UI; Сегодня в 22:15." - за "хороший емкий" ответ
Вы не владеете вопросом?
Мне его нужно было задать в ветке C++ для экспертов ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2014, 23:30
Помогаю со студенческими работами здесь

Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать?
Ребята, если вникать, то вообще ничё непонятно. Вот смотрите: пусть у нас есть абстрактный класс...

Как вызвать функцию через адрес
#include &lt;iostream&gt; void asd() { std::cout &lt;&lt; &quot;hello&quot;; } int main() { void (*g) = asd;...

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

Спрятать указатель на функцию класса в map и вызвать из другого объекта
Товарищи, пишу примитивный &quot;tcp-сервер&quot;. В его задачи входит принятие соединений и получение...

Как вызвать функцию из cpp файла через h файл
Я не знаю как вызвать функцию из файла расширения .cpp через .h файл без ошибок. Код: //...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru