C++运算符重载库类

标签 c++ overloading operator-keyword

我有一个来自 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 库。

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

最佳答案

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

//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==本身有助于避免歧义。

关于C++运算符重载库类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763387/

相关文章:

Java:重写具有不同返回类型的派生类中的方法?

java - 帮助重载方法

c# - 对于运算符重载,C# 编译器如何决定哪个实现适用于混合类型的操作数?

c++ - "binary ' [' : no operator found

c++ - 在框架中使用 OpenGL 上下文编写简单的 wxWidgets 应用程序

c++ - XOR 在 C++ 中返回困惑的值

c# - 非托管 C++ Win32 API 或 C#?

c++ - 在 2 个字符之后插入点,直到 C++ 中的文件末尾

c# - 使 C# webmethod 的参数可选的最佳方法

c++ - std::getline() 如何等同于 bool?