none
Ejemplo sencillo de templates RRS feed

  • Pregunta

  • Hola quiero hacer algo muy sencillo pero no se como codificarlo, lo que quiero hacer es lo siguiente:

    Pasar un objeto como parametro a una funcion, este objeto puede ser de varios tipos, cuando llegue a la funcion dependiente del objeto que sea, se haran determinadas acciones, aqui el ejelplo:

    class A
    {
    //Atributos } class B {
    //Atributos } class C {
    //Atributos } class Letras { A LetraA; B LetraB; C LetraC; } void Funcion(ObjetoCualquiera Obj) main() { Letras Mi_Letra; Funcion(Mi_Letra.A); //Ejemplo 1 Funcion(Mi_Letra.B); //Ejemplo 2 Funcion(Mi_Letra.C); //Ejemplo 3 } void Funcion(ObjetoCualquiera Obj) { if(Obj==Objeto de tipo A) //hago algo if(Obj==Objeto de tipo B) //hago algo if(Obj==Objeto de tipo C) //hago algo }

    A quien me pueda ayudar gracias!

    lunes, 10 de diciembre de 2012 21:33

Respuestas

  • Suena a que usted necesita polimorfismo, no templates.

    class Letra
    {
    public:
        virtual Letra* Funcion() //Retorna una referencia; eliminar el * si lo que quiere es una copia.
        {
            return this;  //Cambiar a *this si lo que quiere es una copia.
        }
    };
    
    class A : public Letra
    {
    public:
        //Sobreescriba Funcion():
        virtual Letra* Funcion()
        {
            printf("Tipo A"); //printf() es C, no C++.
            return this;
        }
    };
    
    //Etc.  Las demás clases.
    
    int main()
    {
        Letra l = new A();
        l.Funcion(); //Imprimirá "Tipo A".
        delete l;
        l = new B();
        l.Funcion(); //Imprimirá "Tipo B".
        delete l;
        return 0;
    }


    Jose R. MCP
    Code Samples

    martes, 11 de diciembre de 2012 23:33
    Moderador

Todas las respuestas

  • Hola.

    Debes utilizar el operador "typeid" de C++, y dependiendo de lo que te devuelva, actuar en consecuencia.

    También debes tener en cuenta que eso sólo es válido si tienes activado el RTTI de C++, que Visual Studio trae así por defecto.

    De todos modos las plantillas no son (o no se suelen usar) para eso. Cuando una plantilla recibe un tipo y realiza una serie de acciones sobre él, ese tipo debe cumplir un interfaz (por ejemplo una serie de operadores, constructores y demás) y entonces la clase plantilla realiza una serie de acciones sobre tu tipo independientemente de qué sea. Y de hecho, si intentas usar una plantilla con un tipo incompleto el compilador no te va a dejar ni siquiera compilar.

    Aquí tienes la referencia sobre el operador typeid:

    http://msdn.microsoft.com/en-us/library/fyf39xec(v=vs.80).aspx

    http://en.wikipedia.org/wiki/Typeid


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    martes, 11 de diciembre de 2012 8:40
    Moderador
  • Hola RFOG, acabo de solucionar parcialmente el problema lo hice de esta manera:

    template <class ObjetoCualquiera>
    
    ObjetoCualquiera Funcion(ObjetoCualquiera  Obj)
    {
    
    	if(typeid(A)==typeid(Obj))
    		printf("Tipo A");
    
    	if(typeid(B)==typeid(Obj))
    		printf("Tipo B");
    
    	if(typeid(D)==typeid(Obj))
    		printf("Tipo D");
    
    	getchar();
    
    	return Obj;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Letras Mi_Letra;
    
    	Funcion(Mi_Letra.LetraA);
    	Funcion(Mi_Letra.LetraB);
    	Funcion(Mi_Letra.LetraD);
    
    	return 0;
    }
    

    Funciona muy bien, solo que necesito que el metodo al cual vaya a llamar y le mande el objeto, tiene que ser el metodo de una clase, no una funcion ordinaria en el mismo archivo donde se encuentra el main, you are MVP C++ help me :) thanks again.

    martes, 11 de diciembre de 2012 16:57
  • Suena a que usted necesita polimorfismo, no templates.

    class Letra
    {
    public:
        virtual Letra* Funcion() //Retorna una referencia; eliminar el * si lo que quiere es una copia.
        {
            return this;  //Cambiar a *this si lo que quiere es una copia.
        }
    };
    
    class A : public Letra
    {
    public:
        //Sobreescriba Funcion():
        virtual Letra* Funcion()
        {
            printf("Tipo A"); //printf() es C, no C++.
            return this;
        }
    };
    
    //Etc.  Las demás clases.
    
    int main()
    {
        Letra l = new A();
        l.Funcion(); //Imprimirá "Tipo A".
        delete l;
        l = new B();
        l.Funcion(); //Imprimirá "Tipo B".
        delete l;
        return 0;
    }


    Jose R. MCP
    Code Samples

    martes, 11 de diciembre de 2012 23:33
    Moderador