你如何初始化私有成员函数指针的静态映射?

How do you initialize static map of private member function pointers?

我正在尝试制作一个 MARIE 代码模拟器,或者随便你怎么称呼它,我正在尝试避免使用较长的 switch case 来访问 class.[=12 中的一些私有函数=]

MARIEapp.h:

MARIEapp.h{
public:
   typedef void (MARIEapp::*Instruction)();
private:
   static std::map<char, Instruction> MARIEinstruction;
   void JnS();
   void Load();
   void Store();
   void Add();
   void Subt();
   void Input();
   void Output();
   void Halt();
   void Skipcond();
   void Jump();
   void Clear();
   void AddI();
   void JumpI();
   void LoadI();
   void StoreI();
};

MARIEapp.cpp:

static std::map<char, MARIEapp::Instruction> MARIEinstruction = {
    { '0', &MARIEapp::JnS },
    { '1', &MARIEapp::Load },
    { '2', &MARIEapp::Store },
    { '3', &MARIEapp::Add },
    { '4', &MARIEapp::Subt },
    { '5', &MARIEapp::Input },
    { '6', &MARIEapp::Output },
    { '7', &MARIEapp::Halt },
    { '8', &MARIEapp::Skipcond },
    { '9', &MARIEapp::Jump },
    { 'A', &MARIEapp::Clear },
    { 'B', &MARIEapp::AddI },
    { 'C', &MARIEapp::JumpI },
    { 'D', &MARIEapp::LoadI },
    { 'E', &MARIEapp::StoreI }
};

长长的 void 函数列表访问私有成员并在 cpp 文件中正确定义

问题是,在初始化 MARIE 指令映射时,我收到一条错误消息,指出这些函数不可访问。我知道这是因为它们是私有的,我可以通过将它们设为 public.

来解决这个问题

有什么方法可以做到这一点并将这些全部保密? 还有你推荐我这样做的其他方法吗?

别担心,您可以在静态 class 成员的初始值设定项中命名私有成员,就像在成员函数的定义中一样。

这里的问题是您没有定义静态 class 成员。您正在定义一个名为 MARIEinstruction 的不相关的全局对象。要定义 class 成员,您必须使用 class 成员访问语法 MARIEapp::MARIEinstruction。另外,不要将 static 关键字放在定义上,只需放在声明上即可。

std::map<char, MARIEapp::Instruction> MARIEapp::MARIEinstruction = {
    { '0', &MARIEapp::JnS },
    { '1', &MARIEapp::Load },
    { '2', &MARIEapp::Store },
    { '3', &MARIEapp::Add },
    { '4', &MARIEapp::Subt },
    { '5', &MARIEapp::Input },
    { '6', &MARIEapp::Output },
    { '7', &MARIEapp::Halt },
    { '8', &MARIEapp::Skipcond },
    { '9', &MARIEapp::Jump },
    { 'A', &MARIEapp::Clear },
    { 'B', &MARIEapp::AddI },
    { 'C', &MARIEapp::JumpI },
    { 'D', &MARIEapp::LoadI },
    { 'E', &MARIEapp::StoreI }
};