Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Dominando las plantillas de clase en C++: guía práctica

Dominando las plantillas de clase en C++: guía práctica

Aprenda cómo aprovechar las plantillas de clase en C++ para escribir código flexible e independiente del tipo con ejemplos claros y reales.

Las plantillas son una piedra angular de la programación genérica en C++. Le permiten crear componentes reutilizables que funcionan con cualquier tipo de dato, mejorando la claridad del código y reduciendo la duplicación. C++ ofrece dos tipos de plantillas: plantillas de función y plantillas de clase.

Las plantillas de clase le permiten definir una sola clase que se adapta a múltiples tipos de datos. Esto no solo acorta su código sino que también lo hace más fácil de mantener.


Declarar una plantilla de clase

Una plantilla de clase comienza con la palabra clave template, seguida de una lista de parámetros de plantilla entre corchetes angulares. Después viene la definición real de la clase.

template <class T>
class MiClase {
private:
    T var;
public:
    T getVar() const;
};

Aquí, T es un marcador de posición para el tipo de dato que se suministrará cuando se instancie la plantilla. La palabra clave class puede reemplazarse con typename sin cambiar la semántica.


Instanciar una plantilla de clase

Una vez definida una plantilla, puede crear objetos especificando el tipo deseado:

MiClase<int> objInt;
MiClase<float> objFloat;
MiClase<std::string> objString;

Cada instanciación genera una clase concreta adaptada al tipo especificado durante la compilación.


Ejemplo 1: Envoltorio genérico de números

#include <iostream>
using namespace std;

// Plantilla de clase que almacena un solo valor de cualquier tipo
template <class T>
class Numero {
private:
    T valor;
public:
    Numero(T v) : valor(v) {}
    T getValor() const {
        return valor;
    }
};

int main() {
    Numero<int> numInt(7);
    Numero<double> numDouble(7.7);
    cout << "int Numero = " << numInt.getValor() << endl;
    cout << "double Numero = " << numDouble.getValor() << endl;
    return 0;
}

Salida

int Numero = 7
double Numero = 7.7

Observe que el parámetro de plantilla T se usa para la variable miembro, argumento del constructor y tipo de retorno, permitiendo que la clase funcione con cualquier tipo.


Definir miembros fuera de la clase

Cuando una función miembro es grande o se comparte entre especializaciones, puede definirla fuera del cuerpo de la clase:

template <class T>
class Muestra {
public:
    T identidad();
};

// Definición fuera de la clase
template <class T>
T Muestra<T>::identidad() {
    return static_cast<T>(1);
}

Observe la repetición de la declaración template<class T> antes de la definición fuera de clase.


Ejemplo 2: Calculadora usando plantillas de clase

#include <iostream>
using namespace std;

template <class T>
class Calculadora {
private:
    T a, b;
public:
    Calculadora(T x, T y) : a(x), b(y) {}
    T sumar() const {
        return a + b;
    }
    T restar() const {
        return a - b;
    }
    T multiplicar() const {
        return a * b;
    }
    T dividir() const {
        return a / b;
    }
    void mostrar() const {
        cout << "a: " << a << ", b: " << b << endl;
        cout << "a + b = " << sumar() << endl;
        cout << "a - b = " << restar() << endl;
        cout << "a * b = " << multiplicar() << endl;
        cout << "a / b = " << dividir() << endl;
    }
};

int main() {
    Calculadora<int> calcInt(2, 1);
    Calculadora<float> calcFloat(2.4f, 1.2f);
    cout << "Resultados int:\n";
    calcInt.mostrar();
    cout << "\nResultados float:\n";
    calcFloat.mostrar();
    return 0;
}

Salida

Resultados int:
a: 2, b: 1
a + b = 3
a - b = 1
a * b = 2
a / b = 2

Resultados float:
a: 2.4, b: 1.2
a + b = 3.6
a - b = 1.2
a * b = 2.88
a / b = 2

Plantillas con múltiples parámetros

Las plantillas de clase pueden aceptar más de un parámetro, e incluso puede proporcionar tipos por defecto:

template <class T, class U, class V = int>
class MultiParam {
    T primero;
    U segundo;
    V tercero;
};

Ejemplo 3: Plantilla multi-parámetro

#include <iostream>
using namespace std;

template <class T, class U, class V = char>
class PlantillaClase {
private:
    T var1;
    U var2;
    V var3;
public:
    PlantillaClase(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {}
    void imprimir() const {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};

int main() {
    PlantillaClase<int, double> obj1(7, 7.7, 'c');
    cout << "valores obj1:\n";
    obj1.imprimir();
    PlantillaClase<double, char, bool> obj2(8.8, 'a', false);
    cout << "\nvalores obj2:\n";
    obj2.imprimir();
    return 0;
}

Salida

valores obj1:
var1 = 7
var2 = 7.7
var3 = c
valores obj2:
var1 = 8.8
var2 = a
var3 = 0

En este ejemplo, el tercer parámetro de plantilla por defecto es char, pero puede sobrescribirse como se muestra con bool en obj2.

Lenguaje C

  1. Palabra clave static en C#: Dominando variables, métodos y clases estáticas
  2. Entendiendo clases anidadas en C#: Definición, uso y herencia
  3. Dominando los Operadores en C++: Guía Completa con Ejemplos Prácticos
  4. Comentarios en C++: Mejores Prácticas para Código Legible y Mantenible
  5. Entendiendo las Clases de Almacenamiento en C++: Alcance, Vida y Uso
  6. Entendiendo el Polimorfismo en C++: Guía Práctica
  7. Dominando la Abstracción de Datos en C++: Simplifica el Diseño con Separación Interfaz-Implementación
  8. Encapsulamiento de Datos en C++: Protege tu Código
  9. Interfaces en C++: Dominando Clases Abstractas y Funciones Virtuales Puras
  10. Dominando Plantillas en C++: Guía de Programación Genérica
  11. Herencia en C#: Construyendo código reutilizable y mantenible