2015-02-27 3 views
0

У меня есть класс от Gtk библиотеки, представляющий цвет (GdkColor) .... я написал свой собственный интервал дерева вокруг него ...C++ оператор перегрузки библиотека классов

В основном, это связывает различные цвета для различных интервалы ...

Теперь, в моем тестовом примере, как только я делаю запрос для интервала, Я хочу сравнить результат с ожидаемым значением.

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.

Есть ли другой способ, которым я могу обойти это?

ответ

0

IF, и только тогда, когда у вас есть вся информация, необходимая для определения равенства, то нет никаких проблем, чтобы определить функцию самостоятельно:

//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==, чтобы избежать устранения неоднозначности.

+0

Я могу заставить его работать таким образом ... но что, если я не знаю внутренних компонентов GdkColor? – basav

+0

@basav Если вы не знаете внутренности, вы не можете сравнить его, не так ли? Вы можете сравнивать их адреса. – Matt

0
  1. operator== не должен быть членом класса (и, вероятно, не нуждается доступ к частной/защищенной части), поэтому он может быть перегружен.

  2. Вы можете создать производный класс и перегрузить все, что захотите внутри него.

  3. Простейшая вещь - это просто вспомогательная функция, вид isEqualTo(), без каких-либо перегрузок.

Смежные вопросы