gpt4 book ai didi

C++属性类结构

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:29 25 4
gpt4 key购买 nike

我有一个用 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;
};

然后,我将实现诸如 PropertyFloat 和 PropertyString 之类的类,并基于仅将字符串与字符串进行比较等假设来为比较器运算符提供实现。然而,问题是如果我这样做的话,不会抛出编译时错误

 if(propertyfloat a < propertystring b)

然而,我对每个派生类的运算符的实现依赖于它们都是同一个派生类。所以我的问题是我无法弄清楚如何实现属性结构,以便我可以让它们全部继承自某个基类型,但是像我上面的代码会抛出编译时错误。

关于如何做到这一点有什么想法吗?对于那些熟悉 QT 的人,我也尝试使用 QVariant 的实现,但是 QVariant 本身没有运算符 < 和 > 只在它的一些派生类中定义,所以它没有成功。

我的最终目标是能够通用地引用属性。我有一个元素类,它包含以字符串“名称”作为键并将 AbstractProperty 作为值的属性 HashMap 。我希望能够对属性进行通用操作。即,如果我想在给定字符串名称的情况下获取属性的最大值和最小值,我有完全通用的方法,这些方法将从每个元素中提取关联的 AbstactProperty 并找到最大值/最小值,无论类型是什么。因此属性虽然最初声明为 PropertyFloat/PropertyString,但它们将被通用地持有。

最佳答案

如果不是让比较运算符成为类的成员,而是让它们成为全局函数,会怎样?

如果这样做,那么您可以为每个给定类型创建一个运算符并控制哪些类型可以相互比较:

bool operator==(const PropertyFloat &leftHand, const PropertyFloat &rightHand);
bool operator==(const PropertyString &leftHand, const PropertyString &rightHand);

编译器会随时提示你这样做:

if(propertyfloat a == propertystring b)

现在,为了访问比较所需的私有(private)数据,让这些全局函数成为派生类的“ friend ”。

关于C++属性类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2701092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com