我有一个在QT开发的c ++项目.我正在运行的问题是我希望有一个基类,我的所有属性类都继承,以便我可以将它们全部存储在一起.现在我有:
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;
};
Run Code Online (Sandbox Code Playgroud)
然后我实现了PropertyFloat和PropertyString等类,并基于假设只有字符串与字符串进行比较等来为比较器运算符提供实现.但是问题是,如果我这样做,就不会抛出编译时错误
if(propertyfloat a < propertystring b)
Run Code Online (Sandbox Code Playgroud)
但是我对每个派生类的运算符的实现依赖于它们都是相同的派生类.所以我的问题是我无法弄清楚如何实现一个属性结构,以便我可以让它们都从一些基类型继承,但像我上面的代码会抛出编译时错误.
关于如何做到这一点的任何想法?对于那些熟悉QT的人,我尝试使用QVariant的实现,但是QVariant没有运算符<和>本身只在其某些派生类中定义,所以它没有用.
我的最终目标是能够一般地引用属性.我有一个元素类,它包含一个属性的hashmap,字符串'name'作为键,AbstractProperty作为值.我希望能够对这些属性进行一般操作.也就是说,如果我想给它的字符串名称我有一个是完全通用的,将拉出从每个元素相关联的AbstactProperty并找到方法最大的属性的最大值和最小值/分钟无论什么类型.因此属性虽然最初被声明为PropertyFloat/PropertyString,但它们将被一般地保存.
小智 5
如果不将比较运算符作为类的成员而使其成为全局函数,该怎么办?
如果你这样做,那么你可以为每个给定的类型创建一个运算符,并控制哪些类型可以相互比较:
bool operator==(const PropertyFloat &leftHand, const PropertyFloat &rightHand);
bool operator==(const PropertyString &leftHand, const PropertyString &rightHand);
Run Code Online (Sandbox Code Playgroud)
编译器会在你这样做的时候抱怨:
if(propertyfloat a == propertystring b)
Run Code Online (Sandbox Code Playgroud)
现在,为了访问比较所需的私有数据,使这些全局函数成为派生类的"朋友".