Есть класс, содержащий две функции и указатель на функцию такого типа.
Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.
Делаю так, но не выходит
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: Указатель на нестатическую функцию в шаблонном классе
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: Указатель на нестатическую функцию в шаблонном классе
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]: Указатель на нестатическую функцию в шаблонном классе
Здравствуйте, Мишень-сан, Вы писали:
МС>Здравствуйте, 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]: Указатель на нестатическую функцию в шаблонном классе
Ещё один вопрос, мне нужны достать реализацию функции из класса, как реализовать?
Перепробовал уйму способов, но компилятор выдаёт либо эту ошибку
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]: Указатель на нестатическую функцию в шаблонном классе
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]: Указатель на нестатическую функцию в шаблонном классе
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 перевели сообщения об ошибках компилятора? Во дела...
H>Есть класс, содержащий две функции и указатель на функцию такого типа. H>Нужна чтобы этот указатель ссылался на одну из функций в зависимости от условия.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском