[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