Resumen - Clase Matrix
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 47 de 104.
Desafío
FácilVamos a crear una clase Matrix que reúna todas las técnicas de sobrecarga de operadores que has aprendido en este capítulo. Crearás una matriz completa que admite operaciones aritméticas, comparaciones, acceso a elementos y salida en flujos, todo mediante una sintaxis intuitiva de operadores.
Organizarás el código en dos archivos:
Matrix.h: Define una claseMatrixque gestiona una matriz 2D de enteros usando memoria dinámica. Tu matriz debe admitir:- Miembros privados: un puntero
int**para los datos 2D y miembrossize_tpara las filas y las columnas - Un constructor que recibe las filas y las columnas e inicializa todos los elementos en 0. Asigna un arreglo de punteros a filas y, luego, cada fila:
data = new int*[rows];ydata[r] = new int[cols];para cada filar - Un destructor que libera correctamente toda la memoria asignada: primero
delete[]para cada fila y, luego,delete[] data; - Un constructor de copia y un operador de asignación por copia (copia profunda con comprobación de autoasignación)
- Los getters
getRows()ygetCols()(ambos const) - Un método
set(row, col, value)para establecer elementos individuales - Un método const
get(row, col)para obtener elementos
Implementa estos operadores:
- Aritméticos:
+y-para sumar y restar matrices (devuelven una nueva Matrix por valor) - Comparación:
==y!=para comprobar si dos matrices tienen las mismas dimensiones y elementos idénticos - Flujo:
<<como función amiga para mostrar la matriz fila por fila, con los elementos separados por espacios y cada fila en una nueva línea - Subíndice:
[], que devuelve un puntero a una fila y permite la sintaxismatrix[row][col](proporciona las versiones const y no const)
Para los operadores aritméticos, supone que ambas matrices tienen las mismas dimensiones. Los operadores de comparación deben devolver
falsesi las dimensiones difieren.- Miembros privados: un puntero
main.cpp: Lee la entrada para crear y manipular dos matrices de 2x2. El formato de entrada es:- Cuatro enteros para la primera matriz (fila por fila): a00, a01, a10, a11
- Cuatro enteros para la segunda matriz (fila por fila): b00, b01, b10, b11
Crea dos objetos
Matrix(cada uno de 2 filas y 2 columnas), rellénalos usando el métodoset()y, después, demuestra tus operadores:Formato de salida:
Matrix A: <row0> <row1> Matrix B: <row0> <row1> A + B: <row0> <row1> A - B: <row0> <row1> A == B: <true/false> A != B: <true/false> A[0][0]: <value> A[1][1]: <value>Cada fila debe mostrar los elementos separados por espacios individuales. Imprime
trueofalse(en minúsculas) para los resultados de comparación.
Por ejemplo, con las entradas 1 2 3 4 para Matrix A y 5 6 7 8 para Matrix B:
Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4Recuerda implementar != en términos de == para que tus operadores sean coherentes. No olvides incluir protecciones contra inclusiones múltiples en tu archivo de encabezado.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// Lee la entrada para la primera matriz (2x2): a00, a01, a10, a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// Lee la entrada para la segunda matriz (2x2): b00, b01, b10, b11
int b00, b01, b10, b11;
cin >> b00 >> b01 >> b10 >> b11;
// TODO: Crea dos objetos Matrix (2 filas y 2 columnas cada uno)
// TODO: Rellena las matrices usando el método set()
// TODO: Muestra Matrix A
// cout << "Matrix A:" << endl;
// Usa el operador << para imprimir la matriz
// TODO: Muestra Matrix B
// cout << "Matrix B:" << endl;
// Usa el operador << para imprimir la matriz
// TODO: Muestra A + B
// cout << "A + B:" << endl;
// TODO: Muestra A - B
// cout << "A - B:" << endl;
// TODO: Muestra los resultados de la comparación
// cout << "A == B: " << (usa el operador ternario para true/false) << endl;
// cout << "A != B: " << (usa el operador ternario para true/false) << endl;
// TODO: Muestra los resultados del acceso mediante índices
// cout << "A[0][0]: " << ... << endl;
// cout << "A[1][1]: " << ... << endl;
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genéricoPractica por tu cuenta: Compilador de C++ online