У меня есть следующая проблема: у меня есть указатель на функцию как член класса B, который существует в инкапсулирующем классе A.
Class A
{
public:
ObjAbs* CreateObject(int id);
private:
Class B
{
typedef ObjAbs* (B::*pfnObjAlloc)();
pfnObjAlloc mfnAlloc;
MemPool* mpPool;
template<typename T>
ObjAbs* TAlloc()
{
ObjAbs* pObj = NULL;
void *memory = NULL;
if(mpMemPool)
memory = mpMemPool->Alloc();
if (NULL != memory)
param = new (memory) T();
return ObjAbs;
}
}
B mAllocArr[maxObjsId];
A::A()
{
mAlloArr[id1] = &A::B::TAlloc<Obj1>;
mAlloArr[id2] = &A::B::TAlloc<Obj2>;
.
.
.
}
}
Я пытаюсь получить к нему доступ из класса А следующим образом:
ObjAbs* A::CreateObject(int id)
{
ObjAbs* pObj = NULL;
if(NULL != AllocArr[id].mfnAlloc)
pObj = (AllocArr[id].*mfnAlloc)(); <-- There lies the problem
return pObj;
}
я продолжаю получать следующую ошибку: ошибка C2065: "mfnAlloc": необъявленный идентификатор
Кто-нибудь может мне помочь?
Благодаря,
pObj = (AllocArr[id].*mfnAlloc)();
пытается найти mfnAlloc
в текущей области, а не в B
Синтаксис для вызова функции "указатель-член" (object.*function)()
, и поскольку оба object
и function
оцениваются в текущей области, вам нужно что-то более похожее
(AllocArr[id].*(AllocArr[id].mfnAlloc))();
который является отвратительным беспорядком кода, поэтому, вероятно, лучше добавить новую функцию-член в B
:
ObjAbs* allocate()
{
return (*mfnAlloc)();
}
поэтому вы можете написать более читаемый
pObj = AllocArr[id].allocate();
A::
перед определениемCreateObject(int id)