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

时间:2017-03-29 18:28:03

标签: c++ class static-members stdmap member-function-pointers

我试图制作一个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映射时,我收到一条错误,指出这些函数不可访问。我知道这是因为他们是私人的,我可以通过公开它来解决这个问题。

有没有办法可以做到这一点并将这些全部保密? 还有其他方法你建议我这样做吗?

1 个答案:

答案 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 }
};