1 Востаннє редагувалося Betterthanyou (18.02.2018 07:06:52)

Тема: Перегрузка операторів

1) Чому я не можу використовувати "inline" в перегрузці оператора ? Якщо я знаю що порівнювання будуть відбуватися часто

inline bool operator==(const Expression& other);

Помилка error: undefined reference to `Expression::operator==(Expression const&)'

2) Для нуля не потрібно писати умови в перегрузці оператора ?
Я перевірив такий код

Expression *f = nullptr;
Expression *b = new Expression;

Начебто порівнюється без написання спеціальних порівняння з нулем

3) Правильно перехоплювати винятки на перегрузці оператора чи ні ?

bool Expression::operator==(const Expression &other) try
{
...Порівняння...
}
catch(...)
{
...Обробка винятку...
}

2 Востаннє редагувалося koala (18.02.2018 10:23:13)

Re: Перегрузка операторів

Надавайте мінімальний шматок коду, що ілюструє поведінку, про яку ви питаєте.
Ми не телепати і не знаємо, як ви використовуєте цей ваш оператор, як цей код розташований у файлах і т.д.
Загалом перевантажений оператор - це звичайна функція, яка викликається незвичним синтаксисом, з цього і виходьте. Тобто

a==b;

це скорочений спосіб записати, наприклад,

a.operator==(b);

В іншому оператори від функцій не відрізняються.

Подякували: Betterthanyou, leofun012

3

Re: Перегрузка операторів

(Компілятор mingw)
Оголошення

class Expression
{
public:
bool operator==(const Expression& other);

Виключення

struct zeroException : std::exception {
    const char* what() const noexcept {return "Error! Size is equal to zero!\n";}
};

Реалізація

bool Expression::operator==(const Expression &other) try
{
    if(this->_size == 0 || other._size == 0)
        throw zeroException();
    return  ( this->_value2 == other._value2 ) &&
            ( this->_value2 == other._value2 ) &&
            ( this->_size == other._size );
}
catch(std::exception& ex)
{
    std::cerr << ex.what();
}

Без inline працює, коли пишу inline: помилка error: undefined reference to `Expression::operator==(Expression const&)'

4

Re: Перегрузка операторів

Betterthanyou
Щоб заінлайнити функцію, лінкер повинен мати доступ не тільки до оголошення функціїї, але й до її реалізації(коду). Скоріш за все у вас реалізація функції знаходиться в cpp-файлі, а має бути в хедері.

Подякували: Betterthanyou, NaharD, leofun01, Yola4

5 Востаннє редагувалося Betterthanyou (18.02.2018 17:58:24)

Re: Перегрузка операторів

Arete написав:

Betterthanyou
Щоб заінлайнити функцію, лінкер повинен мати доступ не тільки до оголошення функціїї, але й до її реалізації(коду). Скоріш за все у вас реалізація функції знаходиться в cpp-файлі, а має бути в хедері.

О точно, я взагалі про це забув. Дякую, тепер проблема вирішена

6

Re: Перегрузка операторів

Arete, він же нічому не навчився. Я йому прямо написав, що треба надати інформацію, як цей код розташований у файлах; а він це тупо проігнорив. Наступного разу він добре знатиме, що робити у випадку такої проблеми - іти на форум, бо тут добрі дяді йому шмарклі витруть і пиріжка дадуть, і думати не треба, а тим більше читати, що пишуть.