C++ c++;运算符重载库类

C++ c++;运算符重载库类,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,我有一个来自Gtk库的类,它表示一种颜色(GdkColor)…我已经围绕它编写了自己的间隔树 基本上,它将不同的颜色关联到不同的间隔 现在,在我的测试用例中,一旦我查询了interval, 我想将输出与预期值进行比较 typedef struct { GdkColor color; }intervalMetaData; struct intervalInfo { signed int low; signed int high; intervalMetaDa

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

基本上,它将不同的颜色关联到不同的间隔

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

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库

我还有别的办法吗

  • operator==
    不应该是该类的成员(并且可能不需要访问该类的私有/受保护部分),因此可以重载该类

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

  • 最简单的就是一个helper函数,类似于
    isEqualTo()
    ,没有任何重载


  • 如果且仅当您拥有确定等式所需的所有信息时,您可以自己定义函数:

    //not sure what GdkColor contains, but if it is large pass by const &
    bool operator==(GdkColor a, GdkColor b) {
        //check equality here
        return result;
    }
    
    运算符==
    不必是成员函数

    如果无法比较两个GdkColor实例,则无法确定它们是否相等。非常简单。如果框架没有提供允许您确定相等性的方法,那么它这样做可能有一个很好的理由。这通常是这样的,既不是
    ,=,!===或任何可比较的内容,并且根本无法访问定义平等关系的成员。我不记得我想实现一个
    操作符==
    ,就是这样。但是,如果必须强制API达到其极限以实现相等比较,则应调查原因

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

    xxx获取信息xxx(结构S)
    或方法
    int比较(结构S*,结构S*)


    我不熟悉GdkColor,但我假设,有一些公开的信息可以让您确定两个实例是否相等。你应该考虑把这个函数放到命名空间中,以防万一GDKCULL一直执行<代码>运算符==/COD>本身来帮助消除歧义。

    我可以用这种方法工作……但是如果我不知道GDKCURE的内部结构呢?@巴萨夫如果你不知道内部的东西,你就无法比较它,对吧?你只能比较他们的地址。为什么不应该呢?2.如果类是final,或者如果它的成员/方法是private 3,那么它将是无用的,那么您不能这样做。这比标准==运算符好多少?