2017-03-29 6 views
1

私はMARIEコードシミュレータを作成しようとしています。それはあなたが何と呼んでも構いません。私はクラス内のいくつかのプライベート関数にアクセスするために長いスイッチケースを避けようとしています。プライベートメンバー関数ポインタの静的マップをどのように初期化しますか?

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であることでこれをやりますか? –

関連する問題