Как наиболее эффективно вернуть несколько значений из перегруженного оператора?(C ++) - PullRequest
1 голос
/ 07 ноября 2010

У меня есть класс «complex», который содержит вещественное и мнимое значение. Я пытаюсь перегрузить оператор +, чтобы я мог добавить реальное к реальному и воображаемое к воображаемому, но я бьюсь головой об стену.

В функции я могу легко получить значения. Вернуть их, однако, сука.

Мой план - перегрузить оператор '=', чтобы я мог перейти

комплекс а, б, в;

(установите a и b)

c = a + b;

затем a + b возвращает комплекс, затем комплекс c равен комплексу, возвращенному a + b

Есть мнение о том, что это жизнеспособный путь?

Есть мнение, можно ли это сделать проще?

Ответы [ 4 ]

2 голосов
/ 07 ноября 2010

Я не уверен, что понимаю проблему.У вас есть complex класс?

struct complex
{
    complex(float real, float imag) :
    real(real), imag(imag)
    {}

    // first make the mutating version
    complex& operator+=(const complex& rhs)
    {
        real += rhs.real; 
        imag += rhs.imag;

        return *this;
    }

    float real, imag;
};

// then use that for the non-mutating version
complex operator+(complex lhs, const complex& rhs)
{
    lhs += rhs;
    return lhs;
}

Это, конечно, просто упражнение;у нас есть std::complex.

2 голосов
/ 07 ноября 2010

Верните их как complex! например,

const complex operator+(const complex &a, const complex &b)
{
    return complex(a.re + b.re, a.im + b.im);
}

Вам не нужно перегружать operator=; компилятор сгенерирует для вас тот, который выполняет поэлементное копирование, что, вероятно, будет достаточно для сложного класса.

1 голос
/ 07 ноября 2010

Что не так с перегрузкой оператора +:

complex operator+(const complex& a, const complex& b) const {
    return complex(a.real + b.real, a.imag + b.imag);
}

И оператор = () аналогично?(но компилятор даст вам это по умолчанию)

complex& operator=(const complex& a) {
    real = a.real;
    imag = a.imag;
    return *this;
}
0 голосов
/ 07 ноября 2010

Он жизнеспособен, но в стандартной библиотеке уже есть класс complex . Используйте его повторно или хотя бы посмотрите, как там происходит перегрузка оператора.

...