Сложный класс [PrintMax]

Итак, я работаю над «ШАБЛОНАМИ», и мне нужно сделать 3 попытки функции PrintMax - очевидно, что она делает - для печати максимального элемента в массиве из 3 элементов, каждая попытка предназначена для разных данных введите в этот массив -double/int/complex-. Поэтому мне нужно сначала создать класс Complex и его необходимые перегрузки операторов, после чего я использую функцию PrintMax в качестве функции шаблона для работы с тремя типами массивов.

Проблема здесь, конечно, в третьем массиве, я не могу записать элементы Complex в массив в этом for ( a + bi ), потому что это мой класс Complex :

    class Complex
{
private :
    int imaginary;
    int real;
public:
    Complex (int = 0, int = 0);
    ~Complex ();
    int getImaginary();
    int getReal();
    void setImagniary(int i);
    void setReal (int r);
    bool operator > (Complex&);
};

Вы можете заметить, я перегрузил оператор > для проверки, но у меня также есть небольшая проблема, помимо того, что я не могу писать элементы таким образом, вторая проблема в том, что я не могу - или сонный и мой мозг умирает - вычислить, что максимум в этом массиве комплексных чисел:

// Input: Complex Array
// 1+3i, 2+4i, 3+3i
// Expected Output: 2+4i

Итак, я хочу назначить их в массиве в такой форме: Arr[3] = {1+3i, 2+4i, 3+3i};

Почему это ожидаемый результат, а не 3+3i?

Спасибо за чтение ~


person Cereal    schedule 15.05.2014    source источник
comment
Может быть, я запутался, но 2+4i больше, чем 3+3i, если вы измеряете абсолютное значение. См. math.pitt.edu/~sparling/23014/23014notes6/node29. .html   -  person Jerry Jeremiah    schedule 15.05.2014
comment
Хотя можно использовать оператор «больше», обычно оператор «меньше» перегружен, поскольку стандартные алгоритмы библиотеки используют оператор «меньше».   -  person Jerry Jeremiah    schedule 15.05.2014
comment
Хорошо, я просто хочу присвоить их массиву в той форме, что написана выше, чтобы это выглядело так: Arr[3]={1+3i, 2+4i, 3+3i}   -  person Cereal    schedule 15.05.2014
comment
Чтобы избежать дублирования, вы можете рассмотреть стандарт std::complex .   -  person cbel    schedule 15.05.2014
comment
Это зависит. Если у вас есть компилятор, поддерживающий С++ 11, у вас есть числовые суффиксы, поэтому вы можете определить i таким образом, но тогда у вас также будет std::complex, так что вам разрешено создавать свой собственный числовой суффикс или это делается с помощью компилятор С++03.   -  person Jerry Jeremiah    schedule 15.05.2014


Ответы (2)


Мне кажется, что вы ищете что-то вроде:

template <typename T> void PrintMax(T array[])
{
   // It is assumed that array has 3 elements in it.
   std::cout <<
      array[0] > array[1] ?
        (array[0] > array[2] ? array[0] : array[2]) :
        (array[1] > array[2] ? array[1] : array[2])
        std::endl;
}
person R Sahu    schedule 15.05.2014
comment
Я хочу ДОБАВИТЬ в него элементы, я уже создал функцию! - person Cereal; 15.05.2014

Вы можете использовать что-то вроде следующего. Обратите внимание, что в коде нет проверки диапазона, это просто для демонстрации того, как вы могли бы решить свою проблему.

Кроме того, я бы посоветовал вам использовать контейнер (например, std::vector) вместо простых массивов.

#include <algorithm>
#include <cmath>
#include <iostream>

class Complex {
private:
    int imaginary;
    int real;
public:    
    Complex(int r, int i) :
            imaginary(i), real(r) {
    }

    ~Complex() {
    }

    int getImaginary() const {
        return imaginary;
    }

    int getReal() const {
        return real;
    }

    void setImaginary(int i) {
        imaginary = i;
    }

    void setReal(int r) {
        real = r;
    }

    double getAbsolut() const {
        return std::abs(std::sqrt(std::pow(imaginary, 2) + std::pow(real, 2)));
    }

    friend bool operator<(const Complex& lhs, const Complex& rhs);
    friend std::ostream& operator<<(std::ostream& stream,
            const Complex& complex);
};

bool operator<(const Complex& lhs, const Complex& rhs) {
    return lhs.getAbsolut() < rhs.getAbsolut();
}

std::ostream& operator<<(std::ostream& stream, const Complex& complex) {
    stream << "Complex(" << complex.real << "+" << complex.imaginary
            << "i)";
    return stream;
}

template<int size, class T>
void getMax(const T arr[]) {
    T max_value = arr[0];
    for (size_t i = 1; i < size; ++i) {
        max_value = std::max(max_value, arr[i]);
    }
    std::cout << "max: " << max_value << std::endl;
}

int main(int argc, char **argv) {
    Complex arr_complex[] = { Complex(3, 3), Complex(2, 4), Complex(1, 3) };
    int arr_int[] = { 3, 5, 1 };
    double arr_double[] = { 2.3, 5.6, 9.1 };

    getMax<3>(arr_complex);
    getMax<3>(arr_int);
    getMax<3>(arr_double);

    return 0;
}
person Ortwin Angermeier    schedule 15.05.2014