2017-03-29 1 views
1

MARIE 코드 시뮬레이터를 만들려고하고 있는데, 뭐라 부를지라도 긴 전환 케이스가 클래스의 일부 개인 함수에 액세스하는 것을 피하려고합니다.어떻게 private 멤버 함수 포인터의 정적 맵을 초기화합니까?

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

무효 함수의 긴 목록은 개인 회원에 액세스하고 제대로 CPP 파일에 문제가

에 정의되어 있습니다 MARIEinstruction 맵을 초기화 할 때 해당 함수에 액세스 할 수 없다는 오류가 표시됩니다. 나는 그것이 사적이기 때문에 그것이라는 것을 알고 있습니다, 그리고 나는 단지 그들을 공개하는 것으로 고칠 수 있습니다.

이렇게 할 수있는 방법이 있으며 모두 비공개로 유지 하시겠습니까? 다른 방법으로이 작업을 수행하도록 권장합니까?

답변

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 } 
}; 
+0

'const'맵에 레이블을 지정하고 싶을 수도 있습니다. 변경하지 않으려 고합니다. – OmnipotentEntity

+0

고마워, 그게 도움이 됐어,하지만 지금은 어떻게 const로 그걸 ​​할까? –

관련 문제