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

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

Войти
Регистрация
Восстановить пароль
 
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
#1

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

28.12.2013, 09:07. Просмотров 1076. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2013, 09:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как вызвать функцию через указатель? (C++):

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

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

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

Как создать указатель на функцию-член класса и вызвать его? - C++
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

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

10
alsav22
5428 / 4823 / 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;
}
};
2
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
28.12.2013, 09:52  [ТС] #3
Огромное спасибо )))!!!! два для мучился(((
А тут так все просто!!!
Профи !!!!
Спасибо)
0
alsav22
5428 / 4823 / 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);
}
2
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
28.12.2013, 10:21  [ТС] #5
Спасибо))
Красивый код))))
0
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
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
1484 / 1130 / 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;
}
0
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
11.01.2014, 16:26  [ТС] #8
Цитата Сообщение от DU Посмотреть сообщение
может потому что A определен ниже тайпдефа, для которого требуется определение А
У меня в начале файла стоит ссылка
#include "файл.h"
где описывается класс А

а затем тайпдефа )))
0
alsav22
5428 / 4823 / 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), или указатель на такой объект.
1
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
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
AlexLan73
2 / 2 / 1
Регистрация: 06.10.2013
Сообщений: 141
11.01.2014, 23:30  [ТС] #11
Спасибо "UI; Сегодня в 22:15." - за "хороший емкий" ответ
Вы не владеете вопросом?
Мне его нужно было задать в ветке C++ для экспертов ?
0
11.01.2014, 23:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2014, 23:30
Привет! Вот еще темы с ответами:

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

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

Как вызвать функцию, описанную в DLL через Custom Action в wix? - C++
Не нашел подходящего раздела для вопроса, поэтому решил сделать здесь, тк DLL написана на c++! Вот сама DLL:#include &lt;stdio.h&gt; ...

Возможно ли вызвать метод наследника через указатель на базовый класс - C++
Возможно ли вызвать метод наследника,через указатель на базовый класс, если он не определён как виртуальный или этого метода просто нет в...


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

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

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