-1 голос
 
3292 просмотра
5.01.2017 / 21:02  Витаминыч

Сравнение объектов (аналог compare/compareTo) в C++

Как лучше реализовать метод сравнения в классе и как его потом использовать?

На данный момент в main.cpp (вне объявления класса) есть такой метод:
  1. int compare(Product a, Product b) {
  2.     if (a.getCode() > b.getCode()) {
  3.         return 1;
  4.     } else if (a.getCode() < b.getCode()) {
  5.         return -1;
  6.     } else {
  7.         return 0;
  8.     }
  9. }
Использование простое, в рамках задачи этого достаточно.

Теперь же настала пора вынести код класса в отдельный файл (Product.cpp), по идее этот метод должен туда перекочевать, чтобы наследники могли его использовать. И тут появились затруднения: в Java это уже все продумано, просто переопределяй метод для своего класса и пользуйся.

А как такое провернуть в С++? В дальнейшем планируется использовать этот метод при сортировке.

В поиске нашел только для строк (string::compare) но мне надо для объектов...
5.01.2017 / 21:49  vlavolk
хочешь использовать operator?
https://m.habrahabr.ru/post/132014/
5.01.2017 / 21:53  Витаминыч
Каким боком перегрузка операторов?
5.01.2017 / 22:01  vlavolk
сортировка через сравнение
5.01.2017 / 22:04  Витаминыч
Сложно, выглядит костыльно
5.01.2017 / 22:09  vlavolk
перегрузка операторов почти везде такая
Ответы
 
2 голоса
 
# 7.01.2017 / 12:16  Ксакеп
Если зайди на страницу sort, то можно увидеть, что:

1. Элементы сравниваются с помощью оператора < ​
2. Можно передать Comparator, который возвращает true / false, и действует так же как оператор в пункте 1.
 
0 голосов
 
# 6.01.2017 / 11:26  vlavolk
  1. //annimon.hpp
  2. #pragma once
  3.  
  4. class Annimon {
  5.    public:
  6.        static int compare(const Annimon&, const Annimon&);
  7.        int id = -1;
  8. };
  9. //annimon.cpp
  10. #include "annimon.hpp"
  11.  
  12. int Annimon::compare(const Annimon& a, const Annimon& b) {
  13.     return a.id - b.id;
  14. }
#pragma onca означает что загрузить его только один раз. Здесь описание вынесено в заголовочный, а реализация внешняя для читаемости кода. Можно сделать и так:
  1. //annimon.hpp
  2. #pragma once
  3.  
  4. class Annimon {
  5.    public:
  6.        static int compare(const Annimon& a, const Annimon& b) {
  7.           return a.id - b.id;
  8.        }
  9.        int id = -1;
  10. };
Как сделать с помощью оператора, надеюсь, ты уже прочитал
Изм. vlavolk от 6.01.2017 / 11:33
6.01.2017 / 12:52  vlavolk
ЭТО ЖЕ ТАК ПРОСТА
6.01.2017 / 13:42  vlavolk
Ну и вызывать Annimon::compare(a, b)
7.01.2017 / 12:09  Ксакеп
В стандарте нет #pragma once
 
0 голосов
 
# 5.01.2017 / 22:05  Naik
да просто переопредели ==, !=, <, >, <=, >= и сравнивай как обычно

bool operator==(const X& lhs, const X& rhs){ / do actual comparison / }

Посмотри всроенные ф-ии типа qsort
Изм. Naik от 5.01.2017 / 22:07
 
0 голосов
 
# 5.01.2017 / 22:03  Витаминыч
Ну или как сделать подобное prod1.compareTo(prod2)? Это простым способом возможно сделать, без костылей? Или я пошел в дебри и все можно проще сделать, без закоса под яву? :-D
 
0 голосов
 
# 5.01.2017 / 22:00  Витаминыч
Для начала: как использовать этот метод, если он описан в классе?

Product::compare(prod1, prod2) - куда это писать? Пробовал в условие, ничего не вышло, хотя странно, он же возвращает значение.. Т.е. if (Product::compare(prod1, prod2) == -1) {} ошибочно.
Как это правильно называется и где про это почитать? (на русском)
5.01.2017 / 22:03  vlavolk
в секцию public, а затем prod1.compare(prod2)
5.01.2017 / 22:27  Витаминыч
И как тогда сам метод будет выглядеть? prod1.compare(prod1, prod2) выглядит ужасно, но работает в рамках одного файла, в отдельный пока не выносил
8.01.2017 / 23:58  Ксакеп
Если захочешь вынести в отдельный файл, то можешь ещё почитать о дружественных функциях (friend function)
Всего: 5

Реклама

Мы в соцсетях

tw tg yt gt