我试图制作一个MARIE代码模拟器,或者你称之为的任何东西,我试图避免使用长开关来访问类中的某些私有函数。
MARIEapp.h:
interface IFromBuilder {
IToBuilder from(String from);
}
interface IToBuilder {
IMailBuilder to(String to);
}
interface IMailBuilder {
Mail build();
}
class MailBuilder implements IFromBuilder, IToBuilder, IMailBuilder {
private String from;
private String to;
@Override
public IToBuilder from(String from) {
this.from = from;
return this;
}
@Override
public IMailBuilder to(String to) {
this.to = to;
return this;
}
@Override
public Mail build() {
return new Mail(from, to);
}
}
class Mail {
private final String from;
private final String to;
public Mail(String from, String to) {
this.from = from;
this.to = to;
}
public static IFromBuilder newBuilder() {
return new MailBuilder();
}
}
public class Demo {
public static void main(String[] args) {
Mail mail = Mail.newBuilder().from("sender@a.com").to("receiver@b.com").build();
}
}
MARIEapp.cpp:
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();
};
void函数的长列表访问私有成员,并在cpp文件中正确定义
问题是,在初始化MARIEinstruction映射时,我收到一条错误,指出这些函数不可访问。我知道这是因为他们是私人的,我可以通过公开它来解决这个问题。
有没有办法可以做到这一点并将这些全部保密? 还有其他方法你建议我这样做吗?
答案 0 :(得分:1)
您的麻烦在于您没有定义静态类成员。您正在定义名为MARIEinstruction
的无关全局对象。要定义类成员,必须使用类成员访问语法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 }
};