Указатель на нестатическую функцию в шаблонном классе
От: Hepri  
Дата: 29.08.10 08:04
Оценка:
Есть класс, содержащий две функции и указатель на функцию такого типа.
Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.

Делаю так, но не выходит
template <class Item>
class A {
public:
    A(unsigned int flag) {
        Call=GetFunc(flag);
    }
    
    int Add(Item Data) {
        return (*Call)(Data);
    }
    
    int (*GetFunc(unsigned int flag))(Item) {
        int (*temp)(Item)=NULL;
        if(flag & 1)
            temp=&A::_FuncA;
        else
            temp=&A::_FuncB;
        return temp;
    }
    int _FuncA(Item Data){return 0;}
    int _FuncB(Item Data){return 1;}
    int (*Call)(Item);
}


В чём ошибка?
Re: Указатель на нестатическую функцию в шаблонном классе
От: Мишень-сан  
Дата: 29.08.10 08:40
Оценка:
Здравствуйте, Hepri, Вы писали:


H>Есть класс, содержащий две функции и указатель на функцию такого типа.

H>Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.

H>Делаю так, но не выходит

H>
H>template <class Item>
H>class A {
H>public:
      typedef int (*A::Call_t)(Item);
H>    A(unsigned int flag) {
H>        Call=GetFunc(flag);
H>    }
    
H>    int Add(Item Data) {
H>        return (*Call)(Data);
H>    }
    
H>    Call_t GetFunc(unsigned int flag) {
                return flag & 1
                    ? &A::_FuncA
                    : &A::_FuncB;
H>    }
H>    int _FuncA(Item Data){return 0;}
H>    int _FuncB(Item Data){return 1;}
        Call_t Call;
H>}
H>


H>В чём ошибка?


Как-то так. В С++ нет автоматического захвата контекста, а следовательно нет и встроенных делегатов. Если нужны замыкания, посмотрите в сторону boost.
Re: Указатель на нестатическую функцию в шаблонном классе
От: Тигра Беларусь  
Дата: 29.08.10 08:43
Оценка:
Дело в то, что указатель на функцию не может быть инициализирован указателем на функцию-член класса.
Смотри выделенное.

H>
H>template <class Item>
H>class A {
H>public:
H>    A(unsigned int flag) {
H>        Call=GetFunc(flag);
H>    }
    
H>    int Add(Item Data) {
H>        return (*Call)(Data);
H>    }
    
H>    int (*GetFunc(unsigned int flag))(Item) {
H>        int (*А::temp)(Item)=NULL;
H>        if(flag & 1)
H>            temp=&A::_FuncA;
H>        else
H>            temp=&A::_FuncB;
H>        return temp;
H>    }
H>    int _FuncA(Item Data){return 0;}
H>    int _FuncB(Item Data){return 1;}
H>    int (*Call)(Item);
H>}
H>
я
Re: Указатель на нестатическую функцию в шаблонном классе
От: morm Россия  
Дата: 29.08.10 08:59
Оценка: +1
Здравствуйте, Hepri, Вы писали:


H>Есть класс, содержащий две функции и указатель на функцию такого типа.

H>Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.

H>Делаю так, но не выходит

H>
H>template <class Item>
H>class A {
H>public:
H>    A(unsigned int flag) {
H>        Call=GetFunc(flag);
H>    }
    
H>    int Add(Item Data) {
H>        return (*Call)(Data);
H>    }
    
H>    int (*GetFunc(unsigned int flag))(Item) {
H>        int (*temp)(Item)=NULL;
H>        if(flag & 1)
H>            temp=&A::_FuncA;
H>        else
H>            temp=&A::_FuncB;
H>        return temp;
H>    }
H>    int _FuncA(Item Data){return 0;}
H>    int _FuncB(Item Data){return 1;}
H>    int (*Call)(Item);
H>}
H>


H>В чём ошибка?


Ты пытаешься сделать преобразование типов int (*temp)(Item) и int (A::*Fn)(Item). При виде этого я сразу вспоминаю песню ГРОБ "Убивать" (послушай, понравится).

Сделай через полиморфизм!!!
Re[2]: Указатель на нестатическую функцию в шаблонном классе
От: morm Россия  
Дата: 29.08.10 09:03
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Здравствуйте, Hepri, Вы писали:



H>>Есть класс, содержащий две функции и указатель на функцию такого типа.

H>>Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.

H>>Делаю так, но не выходит

H>>
H>>template <class Item>
H>>class A {
H>>public:
МС>      typedef int (*A::Call_t)(Item);
H>>    A(unsigned int flag) {
H>>        Call=GetFunc(flag);
H>>    }
    
H>>    int Add(Item Data) {
H>>        return (*Call)(Data);
H>>    }
    
H>>    Call_t GetFunc(unsigned int flag) {
МС>                return flag & 1
МС>                    ? &A::_FuncA
МС>                    : &A::_FuncB;
H>>    }
H>>    int _FuncA(Item Data){return 0;}
H>>    int _FuncB(Item Data){return 1;}
МС>        Call_t Call;
H>>}
H>>


H>>В чём ошибка?


МС>Как-то так. В С++ нет автоматического захвата контекста, а следовательно нет и встроенных делегатов. Если нужны замыкания, посмотрите в сторону boost.


typedef int (A::*Call_t)(Item);
Re[3]: Указатель на нестатическую функцию в шаблонном классе
От: Hepri  
Дата: 29.08.10 09:21
Оценка:
Сделал так
#include <iostream>
using namespace std;

template <class Item>
class A {
public:
    typedef int (A<Item>::*Call_t)(Item);
    A(unsigned int flag) {        
        Call=GetFunc(flag);
    }

    int Add(Item Data) {
        return (*Call)(Data);
    }

    Call_t GetFunc(unsigned int flag) {
                return (flag & 1)
                    ? &A::_FuncA
                    : &A::_FuncB;
    }
    int _FuncA(Item Data){return 3;}
    int _FuncB(Item Data){return 5;}
    Call_t Call;
};

void main()
{
    A<int> x(1);
    cout<<x.Add(50);
}


Вылезает такая ошибка:
результатом вычисления фрагмента не является функция, принимающая 1 аргументов
Re[4]: Указатель на нестатическую функцию в шаблонном классе
От: Hepri  
Дата: 29.08.10 09:24
Оценка:
Всем спасибо решил проблему так
return (this->*Call)(Data);
Re[4]: Указатель на нестатическую функцию в шаблонном классе
От: Hepri  
Дата: 29.08.10 21:19
Оценка:
Ещё один вопрос, мне нужны достать реализацию функции из класса, как реализовать?
Перепробовал уйму способов, но компилятор выдаёт либо эту ошибку
error LNK2019: ссылка на неразрешенный внешний символ "private: int (__thiscall A<int>::*__thiscall A<int>::GetFunc(unsigned int))(int)" (?GetFunc@?$A@H@@AAEP81@AEHH@ZI@Z) в функции "public: __thiscall A<int>::A<int>(unsigned int)" (??0?$A@H@@QAE@I@Z)    main.obj

либо несоответствие с определением или ещё какие ошибки.

Вот код
#include <iostream>
using namespace std;

template <class Item>
class A {
public:
    int Add(Item Data) {
        return (this->*Call)(Data);
    }
     A(unsigned int flag) {        
        Call=GetFunc(flag);
    }
private:
    typedef int (A<Item>::*Call_t)(Item);
    Call_t GetFunc(unsigned int);
    int _FuncA(Item Data){return 3;}
    int _FuncB(Item Data){return 5;}
    Call_t Call;
};

template <class Item>
int (A<Item>::*GetFunc(unsigned int flag))(Item)
{
    return &A<Item>::_FuncA;
}

void main()
{
    A<int> y(0);
    y.Add(1);
}
Re[5]: Указатель на нестатическую функцию в шаблонном классе
От: Юрий Жмеренецкий ICQ 380412032
Дата: 29.08.10 23:47
Оценка:
Здравствуйте, Hepri, Вы писали:

H>Ещё один вопрос, мне нужны достать реализацию функции из класса, как реализовать?


H>Вот код

H>
...
H>template <class Item>
H>int (A<Item>::*GetFunc(unsigned int flag))(Item)
H>{
H>    return &A<Item>::_FuncA;
H>}
H>


Определить вне шаблона?

template <class Item>
typename A<Item>::Call_t A<Item>::GetFunc(unsigned int)
{
    return &A<Item>::_FuncA;
}
Re[5]: Указатель на нестатическую функцию в шаблонном классе
От: Vamp Россия  
Дата: 30.08.10 12:51
Оценка:
H>
H>error LNK2019: ссылка на неразрешенный внешний символ "private: int (__thiscall A<int>::*__thiscall A<int>::GetFunc(unsigned int))(int)" (?GetFunc@?$A@H@@AAEP81@AEHH@ZI@Z) в функции "public: __thiscall A<int>::A<int>(unsigned int)" (??0?$A@H@@QAE@I@Z)    main.obj
H>

А что, в VS перевели сообщения об ошибках компилятора? Во дела...
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Указатель на нестатическую функцию в шаблонном классе
От: morm Россия  
Дата: 01.09.10 18:19
Оценка:
Здравствуйте, Vamp, Вы писали:

H>>
H>>error LNK2019: ссылка на неразрешенный внешний символ "private: int (__thiscall A<int>::*__thiscall A<int>::GetFunc(unsigned int))(int)" (?GetFunc@?$A@H@@AAEP81@AEHH@ZI@Z) в функции "public: __thiscall A<int>::A<int>(unsigned int)" (??0?$A@H@@QAE@I@Z)    main.obj
H>>

V>А что, в VS перевели сообщения об ошибках компилятора? Во дела...

VS 2010 однако...
Re: изврат через полиморфизм ;)
От: Erop Россия  
Дата: 01.09.10 20:21
Оценка:
Здравствуйте, Hepri, Вы писали:


H>Есть класс, содержащий две функции и указатель на функцию такого типа.

H>Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.

Возможно, тебя заинтересует это
Автор: Erop
Дата: 06.03.08
...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.