У меня есть проект на C ++, разрабатываемый в QT. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь один базовый класс, от которого наследуются все мои классы свойств, чтобы я мог хранить их все вместе. Прямо сейчас у меня есть:
class AbstractProperty
{
public:
AbstractProperty(QString propertyName);
virtual QString toString() const = 0;
virtual QString getName() = 0;
virtual void fromString(QString str) = 0;
virtual int toInteger() = 0;
virtual bool operator==(const AbstractProperty &rightHand) = 0;
virtual bool operator!=(const AbstractProperty &rightHand) = 0;
virtual bool operator<(const AbstractProperty &rightHand) = 0;
virtual bool operator>(const AbstractProperty &rightHand) = 0;
virtual bool operator>=(const AbstractProperty &rightHand) = 0;
virtual bool operator<=(const AbstractProperty &rightHand) = 0;
protected:
QString name;
};
затем я реализую классы, такие как PropertyFloat и PropertyString, и обеспечиваю реализацию для операторов компаратора, основываясь на предположении, что только строки сравниваются со строками и так далее. Однако проблема с этим в том, что не было бы сгенерированной ошибки времени компиляции, если бы я сделал
if(propertyfloat a < propertystring b)
однако моя реализация операторов для каждого производного класса основывается на том, что оба они являются одним и тем же производным классом. Так что моя проблема в том, что я не могу понять, как реализовать структуру свойств, чтобы все они могли наследовать от некоторого базового типа, но код, подобный тому, что был у меня выше, выдает ошибку времени компиляции.
Есть идеи, как это можно сделать? Для тех, кто знаком с QT, я попытался использовать также реализацию с QVariant, однако в QVariant операторы <и> не определены сами по себе только в некоторых его производных классах, поэтому он не сработал.
Моя конечная цель состоит в том, чтобы иметь возможность ссылаться на свойства в общем. У меня есть элемент класса, который содержит хэш-карту свойств со строкой 'name' в качестве ключа и AbstractProperty в качестве значения. Я хочу, чтобы иметь возможность работать в целом по свойствам. то есть, если я хочу получить максимальные и минимальные значения свойства с учетом его строкового имени, у меня есть полностью универсальные методы, которые извлекают связанный AbstactProperty из каждого элемента и находят max / min независимо от типа. поэтому свойства, хотя изначально они были объявлены как PropertyFloat / PropertyString, будут храниться в общем виде.