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

C++ 如何初始化私有成员函数指针的静态映射?,c++,class,static-members,stdmap,member-function-pointers,C++,Class,Static Members,Stdmap,Member Function Pointers,我正在尝试制作一个MARIE代码模拟器,或者随便你怎么称呼它,我正在尝试避免一个长的切换案例来访问类中的一些私有函数 附件h: MARIEapp.h{ public: typedef void (MARIEapp::*Instruction)(); private: static std::map<char, Instruction> MARIEinstruction; void JnS(); void Load(); void Store();

我正在尝试制作一个MARIE代码模拟器,或者随便你怎么称呼它,我正在尝试避免一个长的切换案例来访问类中的一些私有函数

附件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.h{
公众:
typedef void(应用程序::*说明)();
私人:
静态std::map指令;
void JnS();
空荷载();
无效存储();
无效添加();
void Subt();
无效输入();
无效输出();
无效暂停();
void Skipcond();
空跳();
无效清除();
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 }
};
静态标准::映射指令={
{0',&app::JnS},
{'1',&MARIEapp::Load},
{'2',&APP::Store},
{'3',&MARIEapp::Add},
{'4',&app::Subt},
{5',&APP::Input},
{6',&APP::Output},
{'7',&app::Halt},
{'8',&MARIEapp::Skipcond},
{'9',&MARIEapp::Jump},
{'A',&app::Clear},
{'B',&mariapp::AddI},
{'C',&MARIEapp::JumpI},
{'D',&MARIEapp::LoadI},
{'E',&MARIEapp::StoreI}
};
void函数的长列表访问私有成员,并在cpp文件中正确定义

问题是,当初始化指令映射时,我得到一个错误,表示这些函数不可访问。我知道这是因为它们是私人的,我可以通过公开它们来解决这个问题

有没有办法让我把这些都保密?
还有其他方法可以推荐吗?

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

这里的问题是没有定义静态类成员。您正在定义一个名为
的无关全局对象。要定义类成员,必须使用类成员访问语法
mariapp::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 }
};
std::map-mariapp::marie指令={
{0',&app::JnS},
{'1',&MARIEapp::Load},
{'2',&APP::Store},
{'3',&MARIEapp::Add},
{'4',&app::Subt},
{5',&APP::Input},
{6',&APP::Output},
{'7',&app::Halt},
{'8',&MARIEapp::Skipcond},
{'9',&MARIEapp::Jump},
{'A',&app::Clear},
{'B',&mariapp::AddI},
{'C',&MARIEapp::JumpI},
{'D',&MARIEapp::LoadI},
{'E',&MARIEapp::StoreI}
};

您还想给地图添加标签
const
您可能不想更改它。谢谢,这很有帮助,但现在我该如何将它设置为const?