как перегрузить операторы + и + = как функции, не являющиеся членами? - PullRequest
3 голосов
/ 19 июня 2020

Сейчас я пытаюсь обновить sh и улучшить свои навыки C ++, и я читаю несколько книг параллельно в зависимости от предмета, который мне нужно изучить.

Сейчас я провожу время на языке программирования C ++ от Страуструпа. На стр. 61/62 есть пример класса для комплексных чисел. Он перегружает ряд операторов, таких как + = и - =. В то же время в нем говорится, что «Многие полезные операции не требуют прямого доступа к представлению комплекса, поэтому их можно определить отдельно от определения класса».

Теперь, когда я пробую следующий код:

#pragma once
#include <iostream>

class Complex
{
private:
    double re, im;
public:
    Complex(double r, double i): re{r}, im{i} {}
    Complex(double r): re{r}, im{0} {}
    Complex(): re{0}, im{0} {}

    double real() const { return re; }
    void real(double d) { re = d; };
    double imag() const { return im; }
    void imag(double d) { im = d; }
    void print();

    Complex& operator+= (Complex z) { re += z.re, im += z.im; return *this; }
    Complex& operator-= (Complex z) { re -= z.re, im -= z.im; return *this; }
};

Complex operator+ (Complex a, Complex b) { return a += b; }

Я получаю сообщение об ошибке ссылки: class Complex_cdecl operator+(class Complex, class Complex) уже определено в Complex.obj Обнаружен один или несколько многократно определенных символов.

Итак, я полагаю, что код, представленный в книге, является только частичное. Я не могу понять, как правильно использовать overload и +, и +=. Книга здесь неправильная или устарела?

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 19 июня 2020

В вашем примере operator + следует либо сделать inline, чтобы компоновщик знал, что несколько файлов obj могут содержать одно и то же определение функции.

inline Complex operator+ (Complex a, Complex b) { return a += b; }

Или файл заголовка должен содержать только декларация

Complex operator+ (Complex a, Complex b);

и ровно один cpp файл должен содержать определение

Complex operator+ (Complex a, Complex b) { return a += b; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...