C++ 如何初始化私有成员函数指针的静态映射?
我正在尝试制作一个MARIE代码模拟器,或者随便你怎么称呼它,我正在尝试避免一个长的切换案例来访问类中的一些私有函数 附件h: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();
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?