【问题标题】:c++ operator overloading library classc++运算符重载库类
【发布时间】:2015-02-27 10:55:13
【问题描述】:

我有一个来自 Gtk 库的类,它代表一种颜色(GdkColor)......我已经围绕它编写了自己的区间树......

基本上,它将不同的颜色与不同的间隔相关联......

现在,在我的测试用例中,一旦我查询间隔, 我想将输出与预期值进行比较。

typedef struct 
{
   GdkColor color; 

}intervalMetaData;

struct intervalInfo 
{
    signed int low;
    signed int high;
    intervalMetaData _data;

};

metaData = _intervalTree.performQuery(BWInterval);
GdkColor red;
//red==metaData.color //throws an error

我不能为 gdkColor 重载 ==,因为它来自 gdk 库。

我还有其他方法可以解决这个问题吗??

【问题讨论】:

    标签: c++ overloading operator-keyword


    【解决方案1】:

    如果,并且仅当您拥有确定相等性所需的所有信息时,自己定义函数是没有问题的:

    //not sure what GdkColor contains, but if it is large pass by const &
    bool operator==(GdkColor a, GdkColor b) {
        //check equality here
        return result;
    }
    

    operator== 不必是成员函数。

    如果您无法比较两个 GdkColor 实例,则无法确定它们是否相等。死的简单。如果框架没有提供允许您确定相等性的方法,它可能有充分的理由这样做。这通常是某种东西,既没有提供<,>,<=, >=, !=, == 也没有提供任何类似的东西,并且根本不可能访问定义相等关系的成员。我不记得想要实现operator==,就是这种情况。但是,如果您必须强制 API 达到其限制以实现相等比较,您应该调查为什么会这样。

    您无法访问的典型情况是 C 库,它使用 typedef 使 struct 不透明。但是,如果它旨在让您操作结构的内容或比较它们,那么框架将提供类似

    xxx getInformationXXX(struct S) 或方法int compare(struct S*, struct S*)

    我不熟悉 GdkColor,但我认为,有一些公开可用的信息可让您确定两个实例是否相等。您应该考虑将此函数放入命名空间,以防 GdkColor 自己实现 operator== 以帮助避免歧义。

    【讨论】:

    • 我可以让它这样工作......但是如果我不知道 GdkColor 的内部结构怎么办?
    • @basav 如果您不了解内部结构,就无法比较它,对吧?您只能比较他们的地址。
    【解决方案2】:
    1. operator== 不应该是该类的成员(并且可能不需要访问它的私有/受保护部分),因此它可以被重载。

    2. 您可以创建派生类并在其中重载您想要的任何内容。

    3. 最简单的就是一个辅助函数,类似于isEqualTo(),根本没有任何重载。

    【讨论】:

    • 1.为什么不应该呢? 2. 如果类是最终类,则不能,否则如果它的成员/方法是私有的,它将无用 3. 这比标准 == 运算符有什么好处?
    猜你喜欢
    • 2017-10-07
    • 2011-11-29
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多