你如何初始化私有成员函数指针的静态映射?
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 }
};
我正在尝试制作一个 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 }
};