Как вы инициализируете статическую карту указателей закрытых функций-членов?

Я пытаюсь создать симулятор кода MARIE, или как бы вы его ни называли, и я пытаюсь избежать длинного случая переключения для доступа к некоторым частным функциям в классе.

МАРИприл.ч:

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

Длинный список функций void обращается к закрытым членам и правильно определен в файле cpp.

Проблема в том, что при инициализации карты инструкций MARIE я получаю сообщение об ошибке, в котором говорится, что эти функции недоступны. Я знаю, это потому, что они частные, и я могу исправить это, просто сделав их общедоступными.

Есть ли способ сделать это и оставить все как личное? Также есть ли другие способы, которыми вы рекомендуете мне это сделать?


person Diego Cuadros    schedule 29.03.2017    source источник


Ответы (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 }
};
person aschepler    schedule 29.03.2017
comment
Вы также хотите пометить карту const Возможно, вы не захотите ее менять. - person OmnipotentEntity; 30.03.2017
comment
Спасибо, это помогло, но как мне это сделать, если это константа? - person Diego Cuadros; 30.03.2017