C++ — идентификация производного класса по указателю базового класса во время выполненияC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++ — идентификация производного класса по указателю базового класса во время выполнения

Сообщение Anonymous »

Я экспериментирую с конечными автоматами, и тот, который я пытаюсь реализовать, использует указатели функций для представления состояний

Код: Выделить всё

typedef void (*State)(Signal const&)

class StateMachine
{
public:
void exampleState(Signal const&);
private:
State m_currentState;
}
По сути, я хочу получить отдельный класс для каждого сигнала, и в каждой функции состояния конечный автомат должен иметь возможность определять, какой тип сигнала был получен, и выполнять соответствующий код. Решение, которое я придумал, выглядит примерно так:

Код: Выделить всё

class Signal {};
class MySignal: public Signal {};

void StateMachine::exampleState(Signal const& signal){
if (typeid(signal) == typeid(MySignal)){
//code here
}
// other cases...
}
Прежде всего, я не уверен, что использование typeid таким образом является хорошей практикой. Кроме того, это работает только в том случае, если Signal имеет хотя бы одну виртуальную функцию.

Другим решением было бы определить своего рода флаг типа, например перечисление, и передать соответствующий ему в производный конструктор сигналов

Код: Выделить всё

enum signalType{
mySignalType
//other types
}

class Signal {
public:
Signal(signalType sig_type):m_type(sig_type){};
const signalType m_type;
};

class MySignal: public Signal {
public:
MySignal():Signal(mySignalType){};
};

void StateMachine::exampleState(Signal const& signal){
switch (signal.m_type){
case mySignalType:
//code here
break;
// other cases...
}
}
хотя для этого требуется, чтобы перечисление расширялось каждый раз при написании нового класса сигнала.

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

Подробнее здесь: https://stackoverflow.com/questions/490 ... at-runtime
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»