使用函数指针调用类的私有函数?

时间:2014-09-16 07:30:53

标签: c++ pointers

我使用函数指针解决了一个问题,我对解决方案有点担心,需要建议。

我的项目中有几个类实现了一个内存表,一个本地数据结构,它将一些数据保存在内存中。

所有函数都是私有的,因此除了类本身之外,没有其他正文可以使用它自己的函数来使用/修改数据。

最近我有一个要求,我必须在不同的模块中使用这些数据。因为我不想将私有函数设置为public,所以我在应用程序启动时将所有类的函数指针(所需函数的函数)存储在std:map中。后来我只需通过这些指针调用函数,无论我需要修改特定类的数据。

我想知道这是否正确?使用函数指针在不同的类中调用类的私有函数?

下面的代码有点模拟了我试图实现的内容:

typedef struct
{
  void (*pfnDisplay)(void);
}FuncInfo;

std::map<int,FuncInfo> sFuncInfoMap;

//Stores the function pointer in a map
void RegisterFunction(void (*pfnDisplay)(void))
{
  FuncInfo sFuncInfo;
  sFuncInfo.pfnDisplay = pfnDisplay;
  sFuncInfoMap.insert ( std::pair<int, FuncInfo>(1, sFuncInfo) );
}

class A
{
private:
  static void Display(void)
  {
    printf("No one can access me");
  }
public:
  A()
  {
    RegisterFunction(Display);
  }
};

class B
{
  public:
  void CallADisplay()
  {
    sStFuncInfoMap[1].pfnDisplay();
  }
};


#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
  A a;  //calls the constructor
  B b;
  b.CallADisplay();
  return 0;
}

**Output:**
No one can access me

谢谢。

1 个答案:

答案 0 :(得分:5)

是的,您可以通过函数指针调用私有函数,更一般地,通过指针间接访问任何成员;虽然您只能在允许访问的上下文中创建该指针。

访问控制仅阻止使用成员的名称,而不是(间接)访问成员本身。