La reutilización es uno de los conceptos más importantes de la Ingeniería del Software . La reutilización significa desarrollar código que se pueda reutilizar en el mismo programa o en diferentes programas. C++ permite la reutilización a través de herencia , contenedores , polimorfismo y genericidad . Pero, hay otra forma de definir bloques de construcción independientes. Esto se puede lograr creando archivos de encabezado y archivos de implementación.
Los archivos de encabezado son los archivos que incluyen la declaración de clase . El nombre de la clase suele ser el mismo que el del archivo de cabecera. (Por ejemplo, una clase LinkedList se almacenará dentro de un archivo de encabezado LinkedList.h)
Por otro lado, el archivo de implementación consta de la definición de función de la clase que se definió dentro del archivo de encabezado. Generalmente, el nombre del archivo es el nombre de la clase, con una extensión .cpp. (Por ejemplo, la definición de función de una clase LinkedList se almacenará dentro de un archivo de encabezado LinkedList.cpp)
Ahora, para crear un objeto de la clase, definida en el archivo de encabezado anterior, debe haber una función main() . Pero espera, ¿dónde definir una función main(), en particular, qué archivo?
La función principal se define dentro de otro archivo, conocido como el archivo del controlador o, en algunos casos, el archivo del cliente.
Ejemplo: aquí se implementa la clase complexNum . Se divide en dos archivos. El archivo de encabezado tiene la extensión.h y contiene las definiciones de clase.
Archivo de cabecera:
C++
// Header file complexNum.h #ifndef COMPLEXNUM_H #define COMPLEXNUM_H class complexNum { private: int real; int imaginary; public: // With default value, // default constructor complexNum(const int a = 0, const int b = 0); // setter function void setNum(const int a, const int b); // Prints the complex number // in the form real + i(imaginary), // i->iota void print() const; // An overloaded operator to compare // two complex number objects bool operator==(const complexNum&); }; #endif
Archivo de implementación:
C++
// Implementation file // complexNum.cpp #include "complexNum.h" #include <iostream> using namespace std; // A default constructor complexNum::complexNum(int a, int b) { real = a; imaginary = b; } // A function to set values void complexNum::setNum(const int a, const int b) { real = a; imaginary = b; } // A function to print the complex // number in the form real + // (imaginary)i, i->iota void complexNum::print() const { cout << real << " + " << imaginary << "i" << endl; } // An overloaded operator to // compare two complex Number // objects bool complexNum::operator==(const complexNum& obj) { if (this->real == obj.real && this->imaginary == obj.imaginary) { return true; } return false; }
Ahora, para verificar la corrección e implementar la clase complexNum anterior , se necesita un archivo de controlador. A continuación se muestra el archivo del controlador:
C++
// Driver file to illustrate // the implementation of // complexNum.cpp file #include "complexNum.h" #include <iostream> using namespace std; // Driver code int main() { // Defines a complex number // object (obj1 = 4 + 5i) complexNum obj1(4, 5); complexNum obj2; // Defines a complex number // object (obj2 = 3 + 4i) obj2.setNum(3, 4); // Prints the complex number obj1.print(); obj2.print(); // Checks, if two complex // number objects are equal or // not if (obj1 == obj2) { cout << "Both the numbers are equal" << endl; } else { cout << "Numbers are not equal" << endl; } return 0; }
Producción:
Nota:
El encabezado, la implementación y los archivos del controlador deben estar en la misma carpeta. De lo contrario, proporcione el enlace del directorio de trabajo actual en las declaraciones de inclusión.
Los programadores ya utilizan archivos de encabezado, que son muy útiles y se vuelven prácticos al implementar varias estructuras de datos y algoritmos. Por ejemplo, las arrays dinámicas se pueden implementar mediante el archivo de encabezado <vector>.
Ventajas de almacenar la definición de clase en diferentes archivos:
- La herencia se puede usar para lograr la reutilización del código, pero el inconveniente es que una clase debe heredarse de una clase dentro del mismo archivo. No se puede heredar una clase de un archivo diferente.
- Pero este problema se resuelve usando el encabezado y los archivos de implementación, lo que hace que la clase sea reutilizable.
- Si la implementación de la clase no cambia, entonces no hay necesidad de volver a compilarla.
Publicación traducida automáticamente
Artículo escrito por duttabhishek0 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA