2017-03-29 3 views
1

J'essaie de faire un simulateur de code MARIE, ou peu importe comment vous l'appelez, et j'essaie d'éviter un long cas de commutateur pour accéder à certaines fonctions privées dans la classe.Comment initialiser la carte statique des pointeurs de fonction de membre privé?

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

La longue liste des fonctions vides et accéder aux membres privés sont définis correctement dans le fichier cpp

Le problème est que lors de l'initialisation de la carte MARIEinstruction, j'obtiens une erreur indiquant que ces fonctions ne sont pas accessibles. Je sais que c'est parce qu'ils sont privés, et je peux réparer cela en les rendant publics.

Y a-t-il un moyen de le faire et de les laisser tous privés? Y a-t-il d'autres façons de me recommander?

Répondre

1

Ne vous inquiétez pas, vous êtes autorisé à nommer des membres privés depuis l'initialisateur d'un membre de classe statique, comme dans la définition d'une fonction membre. Votre problème ici est que vous ne définissez pas le membre de classe statique. Vous définissez un objet global non apparenté nommé MARIEinstruction. Pour définir le membre de classe, vous devez utiliser la syntaxe d'accès de membre de classe MARIEapp::MARIEinstruction. En outre, ne mettez pas le mot-clé static sur la définition, juste sur la déclaration.

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

Vous souhaitez également étiqueter la carte 'const' Vous ne voulez probablement pas le changer. – OmnipotentEntity

+0

Merci, ça a aidé, mais maintenant comment est-ce que je le ferais avec un const? –