не в состоянии использовать указатель на функцию в качестве члена класса

0

У меня есть следующая проблема: у меня есть указатель на функцию как член класса 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": необъявленный идентификатор

Кто-нибудь может мне помочь?

Благодаря,

  • 1
    начать с добавления A:: перед определением CreateObject(int id)
  • 0
    Вы уверены, что ошибка не появляется на одну строку выше?
Показать ещё 2 комментария
Теги:

1 ответ

1
pObj = (AllocArr[id].*mfnAlloc)();

пытается найти mfnAlloc в текущей области, а не в B

Синтаксис для вызова функции "указатель-член" (object.*function)(), и поскольку оба object и function оцениваются в текущей области, вам нужно что-то более похожее

(AllocArr[id].*(AllocArr[id].mfnAlloc))();

который является отвратительным беспорядком кода, поэтому, вероятно, лучше добавить новую функцию-член в B:

ObjAbs* allocate()
{
    return (*mfnAlloc)();
}

поэтому вы можете написать более читаемый

pObj = AllocArr[id].allocate();
  • 0
    Спасибо!! оно работает!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню