Я пытаюсь реализовать что-то вроде шаблона команды для управления серверными компонентами с тем же интерфейсом. Каждый компонент должен реализовать следующий интерфейс.C++ command pattern
class ComponentInterface {
public:
virtual int start() = 0;
virtual int stop() = 0;
};
Каждый производный компонент реализует некоторые конкретные методы.
class Led : public ComponentInterface {
public:
/**
* Implements Interface methods
*/
int start() { return 0; }
int stop() { return 0; }
private:
int setIntensity(int attrs[], int returns[]) {
printf("Set intensity called");
return 1;
}
};
Основная идея состоит в том, что каждый подкласс хранить вызываемые функции-члены в массиве указателей и в ComponentInterface
классе будет реализовали методы, которые могут вызывать эту функцию на основе индекса команды.
class ComponentInterface {
public:
...
// for storing the pointers
int (ComponentInterface::*commandsArray[10])(int[], int[]);
// to call the member functions
int command(int commandId, int attrsList[], int responseList[]) {
return (this->*commandsArray[commandId])(attrsList, responseList);
}
}
class Led : public ComponentInterface {
public:
Led(float* ledIntensity) {
// store the command in the array
this->commandsArray[0] = (&Led::setIntensity);
}
// redefine the array for pointers of this subclass
int (Led::*commandsArray[5])(int[], int[]);
};
Я не знаком с C++, и я не понимаю, почему он не работает, у меня есть проблемы при вызове хранимых функций.
При тестировании с devC++ я получаю ошибку сегментации. Когда я попытался проверить его в Visual Studio 2013 (Visual C++) и отладчик, кажется, что в этом ряду
(this->*commandsArray[commandId])(attrsList, responseList);
, то this
объект указывает на ComponentInterface объекта вместо светодиодное объекта.
«У меня проблемы», по сути, бесполезно - какие у вас проблемы? Каковы ошибки компилятора или времени выполнения, которые вы получаете? – Mat
@Mat - Я тестирую его с помощью 'devC++', и я становлюсь« ошибкой сегментации » –
Segfault где? Используйте отладчик, чтобы узнать. Затем исследуйте и добавьте то, что вы нашли на свой вопрос. – Mat