c++ 运算符重载库 class

c++ operator overloading library class

我有一个来自 Gtk 库的 class 代表一种颜色 (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 库。

有没有其他方法可以解决这个问题?

  1. operator== 不应该是 class 的成员(并且可能不需要访问其中的 private/protected 部分),所以它可以过载。

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

  3. 最简单的就是一个辅助函数,有点像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;
}

operator== 不必是成员函数。

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

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

的内容

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

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