Привет, можно ли реализовать следующее?
Есть много классов объектов, у которых есть общий предок.
У каждого класса есть свое состояние объекта (по сути набор булевых или целочесленных значений). Для каждого класса этот набор отличается, но есть и общие значения.
Я определил базовый класс состояния так:
class CAbstractState
{
public:
enum ContactState {csUnknown=-1,csOff,csOn,csBlink}; //состояние "контакта"
CAbstractState();
virtual void disable()=0; //установка неактивного состояния
virtual void enable()=0; //установка активного состояния по умолчанию
virtual void clear()=0; //инициализация
bool changed; //признак изменения состояния на сервере
};
Затем для базового класса объявил наследника
class CRailObjectState : public CAbstractState
{
public:
CRailObjectState();
ContactState error; //признак ошибки
ContactState block; //признак блокировки
void disable();
void enable();
void clear();
CRailObjectState &operator=(const CRailObjectState & state);
bool operator==(const CRailObjectState & state);
bool operator!=(const CRailObjectState & state);
};
CRailObjectState &CRailObjectState::operator =(const CRailObjectState &state)
{
if(this!=&state)
{
error = state.error;
block = state.block;
}
return *this;
}
bool CRailObjectState::operator==(const CRailObjectState &state)
{
return (error==state.error) && (block==state.block);
}
bool CRailObjectState::operator!=(const CRailObjectState &state)
{
return !(*this==state);
}
и к примеру еще одни наследник для конкретного типа объекта
class CLightState : public CRailObjectState
{
public:
CLightState();
ContactState manevrSignal;
ContactState trainSignal;
ContactState inviteSignal;
ContactState blueSignal;
ContactState ngState;
ContactState lampFail;
void disable();
void enable();
void clear();
CLightState &operator=(const CLightState & state);
bool operator ==(const CLightState & state);
bool operator !=(const CLightState & state);
void setDeined();
void setAllowManevr();
void setAllowTrain();
bool isDenied();
};
CLightState &CLightState::operator =(const CLightState &state)
{
if(this!=&state)
{
this->error = state.error;
this->block = state.block;
this->manevrSignal = state.manevrSignal;
this->trainSignal = state.trainSignal;
this->inviteSignal = state.inviteSignal;
this->blueSignal = state.blueSignal;
this->ngState = state.ngState;
this->commandK = state.commandK;
this->commandMk = state.commandMk;
this->commandKm = state.commandKm;
this->releK = state.releK;
this->releMk = state.releMk;
this->releKm = state.releKm;
}
return *this;
}
bool CLightState::operator ==(const CLightState &state)
{
return (this->error == state.error) &&
(this->block == state.block) &&
(this->manevrSignal == state.manevrSignal) &&
(this->trainSignal == state.trainSignal) &&
(this->inviteSignal == state.inviteSignal) &&
(this->blueSignal == state.blueSignal) &&
(this->ngState == state.ngState) &&
(this->commandK == state.commandK) &&
(this->commandMk == state.commandMk) &&
(this->commandKm == state.commandKm) &&
(this->releK == state.releK) &&
(this->releMk == state.releMk) &&
(this->releKm == state.releKm);
}
bool CLightState::operator !=(const CLightState & state)
{
return !(*this==state);
}
Базовый класс объектов (очень урезанный)
class CRailObject : public QObject, public CXMLSerialisationObject
{
Q_OBJECT
CRailObjectState * fobjectState; //состояние объекта
explicit CRailObject(CEC * ParentEC);
~CRailObject();
void update(CRailObjectState * State);
virtual bool calcState() = 0; //вычислить состояние
}
Вобщем все вычисления состояния объекта производятся в виртуальной функции calcState().
В функцию update(..) для кадого класса передается соотвествующее ему состояние (как показано выше).
Можно ли сделать операторы присваивания и сравнения виртуальными? что бы сравенение наследников было корректным?
Т.е. что бы для состояний CLightState вызывался соответствующий оператор присваивания/сравнения?