[C con Clase] operador

jose luis jcmdustin en gmail.com
Vie Dic 2 04:13:54 CET 2011


El pasado 2011-11-27 19:24:47, Steven Davidson escribió:
 
SD> Hola José Luis,
SD> 2011/11/27 jose luis <jcmdustin en gmail.com>:
SD> > Hola amigos... hace poco estube haciendo un programa para un profesor y encontre el siguiente ...
SD> >
SD> Israel ya te ha contestado, pero sólo quiero mencionar algunos
SD> problemas de diseño que he visto con esta clase.
SD> > const int MAXCANAL = 80 ; // numero maximo de canal
SD> > const int MAXVOLUMEN = 10 ; // nivel maximo de volumen
SD> Deberías definir estas constantes dentro de la clase 'televisor', que
SD> es quien usa esta información. Esto sería,
SD> class televisor
SD> {
SD> public:
SD>   static const int MAXCANAL;
SD>   static const int MAXVOLUMEN;
SD>   ...
SD> };
SD> const int televisor::MAXCANAL = 80;
SD> const int televisor::MAXVOLUMEN = 10;
SD> > class televisor{
SD> > private:
SD> >    char marca[15] ;    // marca del televisor
SD> >    int canal ;         // numero de canal que esta sintonizando
SD> >    int volumen;        // nivel de volumen del televisor
SD> >    bool estado;        // false: apagado, true; prendido
SD> Recomiendo definir constantes para dejar bien establecido los valores
SD> para "estado". Por ejemplo,
SD> class televisor
SD> {
SD> public:
SD>   static const bool PRENDIDO;  // o como lo escribiría yo :)  ENCENDIDO
SD>   static const bool APAGADO;
SD>   ...
SD> };
SD> const bool televisor::PRENDIDO = true;
SD> const bool televisor::APAGADO = !televisor::PRENDIDO;
SD> Así podemos usar estas constantes al usar los objetos de 'televisor'.
SD> > public:
SD> >    televisor () ;
SD> >    televisor ( char m[15], int c, int v, bool e) ;
SD> >    televisor ( televisor &t) ;
SD> Acostúmbrate a usar 'const' para los parámetros que sean arrays,
SD> punteros, o referencias y que sirvan para entregar información. Esto
SD> sería,
SD>   televisor( const char m[15], int c, int v, bool e );
SD>   televisor( const televisor &t );
SD> >    ~televisor () ;
SD> >    void getmarca () ;
SD> Esta función miembro realmente no debería estar. Si quieres mostrar
SD> información a la pantalla, crea una función global que use la interfaz
SD> pública de esta clase, a modo de función auxiliadora, pero no como una
SD> función miembro perteneciente a la interfaz pública de 'televisor'. No
SD> es muy lógico.
SD> Lo que sí deberías hacer es que 'getmarca()' retornase la cadena de
SD> caracteres. Como no quieres permitir que "alguien externo" modifique
SD> esta información, indica que es 'const'. Por ejemplo,
SD> const char *getmarca() const;
SD> >    int getcanal () ;
SD> >    int getvolumen () ;
SD> Estas dos funciones miembro también deberían ser funciones constantes,
SD> ya que no tienen ninguna intención de modificar el estado de "este
SD> objeto".
SD> >    void operator * () ;        // prender o apagar el televisor
SD> >    void operator ++ () ;       // cambia de canal al siguiente
SD> >    void operator -- () ;       // cambia de canal al anterior
SD> No aconsejo que estos operadores no retornen nada. Deberían retornar
SD> "este objeto" ya modificado. Por ejemplo,
SD> televisor &operator*();
SD> televisor &operator++();
SD> televisor &operator--();
SD> televisor &operator*()
SD> {
SD>   estado = !estado;
SD>   return *this;
SD> }
SD> De esta manera, podemos "encadenar" operaciones. Por ejemplo,
SD> televisor mitele( "Samsung", 1, televisor::MAXVOLUMEN*2/3, televisor::APAGADO );
SD> cout << (++*mitele).getvolumen() << endl;
SD> Si los operadores no retornan nada, entonces no podrías hacer esto,
SD> sino operar en cada sentencia; o sea,
SD> *mitele;
SD> ++mitele;
SD> cout << mitele.getvolumen() << endl;
SD> Esto es un poco engorroso, creo yo.
SD> >    void cambiar (int c) ;      // cambiar al canal c
SD> >    void operator + (int n) ;   // aumenta el volumen n niveles
SD> >    void operator - (int n) ;   // disminuye el volumen n niveles
SD> Nuevamente, sugiero retornar una referencia a "este objeto".
SD> >    friend bool operator == (televisor x, televisor y) ; // compara
SD> Deberías usar 'const televisor &' para pasar objetos que no vayan a
SD> ser modificados. Te ahorras memoria y tiempo de ejecución.
SD> > };
SD> Espero que esto te sirva.
SD> Steven

Gracias Steven, siempre es bueno trabajar con estilo! agradesco tus recomendaciones... Aun soy novato pero siempre estoy dispuesto a aprender!
Ha, tambien agradesco a Hisrael, habia olvidado que trabajaba con metodos y por eso ovie los parentesis
Se aprende a programar programando...


Más información sobre la lista de distribución Cconclase