// Programación en C++ para Ingenieros, Ed. Thomson Paraninfo, 2006
// Capítulo 8: Diseño descendente

// Fichero complejo.h
// Declaración de la clase complejo

// Por si este fichero estuviera definido
// lo controlamos con estas directivas
#ifndef MI_COMPLEJO_H
    #define MI_COMPLEJO_H

    #include <iostream>

    using namespace std;

    class Complejo{
        private:
            double real,imag;
        public:
            Complejo();

            // Constructor general
            Complejo(double, double);

            // Constructor de copia
            Complejo(const Complejo&);

            // Método para modificar la parte real
            void setReal(double);

            // Método para modificar la parte imaginaria
            void setImag(double);

            // Método para devolver la parte real
            double getReal();

            // Método para devolver la parte imaginaria
            double getImag();

            // Método para el cálculo del conjugado de un
            //complejo
            Complejo conjugado();

            // Métodos para la representación polar:
            // Cálculo del módulo de un complejo
            double modulo();
            // Método para el cálculo del argumento de
            // un complejo
            double angulo();

            // Método para el cálculo del inverso de un complejo
            Complejo inverso();

            // Operadores miembro sobrecargados
            Complejo operator- ();
            Complejo operator+ (const Complejo& c);
            Complejo operator- (const Complejo& c);
            Complejo operator* (const Complejo& c);
            Complejo operator/ (const Complejo& c);

            // Operador miembro de asignación sobrecargado
            Complejo& operator= (const Complejo& c);

            // Operador friend de test de igualdad sobrecargado
            friend bool operator== (const Complejo& c1,const Complejo& c2);

            // Operador friend de test de desigualdad sobrecargado
            friend bool operator!= (const Complejo& c1,const Complejo& c2);

            // Operador friend << sobrecargado
            friend ostream& operator<< (ostream& co, const Complejo& c);

            // Operador friend >> sobrecargado
            friend istream& operator>> (istream& ci, Complejo& c);
    };
#endif