наследование — таблица / карта указателя статической функции в стеке переполнения

У меня есть базовый класс, представляющий обработчик для некоторого (общего) hardwre, из которого происходят определенные экземпляры. Командный протокол, который получает обработчик, содержит строку, которая определяет функцию, которую выполняет обработчик.

Я хотел бы построить статическое отображение строк для указателей на функции, используя HashMap (который в основном похож на std::map насколько я знаю, так что это должно применяться более или менее одинаково к JUCE и std). Я хочу, чтобы это было статичным, потому что это отображение не изменится, и я не хочу перестраивать его каждый раз, когда создаю экземпляр обработчика (что может случиться много).

//general hardware handler
class HandlerBase {
public:

// all command handlers take a BazCommand reference and return success
typedef bool (HandlerBase::* commandHandler)(BazCommand&);

// this is the mapping of String to the handler function that
// determines which function to run when getting a command
typedef HashMap<String, commandHandler> CmdList;
}

// handler for the Foomatic Barrifier 2000
class FoomaticHandler : public HandlerBase {
public:

//one of the Foomatic handler functions
bool barrify(BazCommand& cmd) {
return true;
}

static CmdList createCmdMapping() {
CmdList l;

l.set("bar", (commandHandler) &FoomaticHandler::barrify);
// add all Foomatic handler functions here

return l;
}

bool doCommand(BazCommand& cmd) {
String cmdString = cmd.getCmdString();

//execute correct function here
}

//this cmdList is static and shared betweeen all Foomatic handlers
static CmdList cmdList;
}

// set up the Foomatic command hashmap
FoomaticHandler::CmdList FoomaticHandler::cmdList =
FoomaticHandler::createCmdMapping();

Однако этот подход порождает много ошибок. Я попробовал несколько альтернативных аранжировок. Этот конкретный производит:

../core/../../../juce/JuceLibraryCode/modules/juce_audio_basics/../juce_core/containers/juce_HashMap.h: In static member function ‘static HandlerBase::CmdList FoomaticHandler::createCmdMapping()’:
../core/../../../juce/JuceLibraryCode/modules/juce_audio_basics/../juce_core/containers/juce_HashMap.h:445:5: error: ‘juce::HashMap<KeyType, ValueType, HashFunctionToUse, TypeOfCriticalSectionToUse>::HashMap(const juce::HashMap<KeyType, ValueType, HashFunctionToUse, TypeOfCriticalSectionToUse>&) [with KeyType = juce::String, ValueType = bool (HandlerBase::*)(BazCommand&), HashFunctionToUse = juce::DefaultHashFunctions, TypeOfCriticalSectionToUse = juce::DummyCriticalSection, juce::HashMap<KeyType, ValueType, HashFunctionToUse, TypeOfCriticalSectionToUse> = juce::HashMap<juce::String, bool (HandlerBase::*)(BazCommand&)>]’ is private
FoomaticHandler.cpp:77:16: error: within this context

Как правильно создать такую ​​статическую строку -> отображения функций-членов? И может createCmdList() быть сделано чисто виртуальным для обеспечения реализации?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]