Ripasso - Classe Matrix
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 47 di 104.
Sfida
FacileCostruiamo una classe Matrix che riunisce tutte le tecniche di sovraccarico degli operatori che hai imparato in questo capitolo. Creerai una matrice completa che supporta operazioni aritmetiche, confronti, accesso agli elementi e output su stream: tutto tramite una sintassi intuitiva degli operatori.
Organizzerai il codice in due file:
Matrix.h: Definisci una classeMatrixche gestisce un array bidimensionale di interi usando la memoria dinamica. La matrice deve supportare:- Membri privati: un puntatore
int**per i dati bidimensionali e membrisize_tper righe e colonne - Un costruttore che accetta righe e colonne e inizializza tutti gli elementi a 0
- Un distruttore che libera correttamente tutta la memoria allocata
- Un costruttore di copia e un operatore di assegnazione per copia (copia profonda con controllo dell'autoassegnazione)
- I getter
getRows()egetCols()(entrambi const) - Un metodo
set(row, col, value)per impostare singoli elementi - Un metodo const
get(row, col)per recuperare gli elementi
Implementa questi operatori:
- Aritmetici:
+e-per l'addizione e la sottrazione di matrici (restituiscono una nuova Matrix per valore) - Confronto:
==e!=per verificare se due matrici hanno le stesse dimensioni e gli stessi elementi - Stream:
<<come funzione friend per visualizzare la matrice riga per riga, con gli elementi separati da spazi e ogni riga su una nuova linea - Indice:
[]che restituisce un puntatore a una riga, consentendo la sintassimatrix[row][col](fornisci sia la versione const sia quella non const)
Per gli operatori aritmetici, supponi che entrambe le matrici abbiano le stesse dimensioni. Gli operatori di confronto devono restituire
falsese le dimensioni differiscono.- Membri privati: un puntatore
main.cpp: Leggi l'input per creare e manipolare due matrici 2x2. Il formato dell'input è:- Quattro interi per la prima matrice (riga per riga): a00, a01, a10, a11
- Quattro interi per la seconda matrice (riga per riga): b00, b01, b10, b11
Crea due oggetti
Matrix(ciascuno con 2 righe e 2 colonne), popola le matrici usando il metodoset(), quindi mostra i tuoi operatori:Formato dell'output:
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>Ogni riga deve mostrare gli elementi separati da singoli spazi. Stampa
trueofalse(in minuscolo) per i risultati dei confronti.
Ad esempio, con gli input 1 2 3 4 per Matrix A e 5 6 7 8 per 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]: 4Usa std::stoi() per la conversione dell'input. Ricorda di implementare != in termini di == per mantenere coerenti i tuoi operatori. Non dimenticare le guardie di inclusione nel file header.
Provalo tu
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// Leggi l'input per la prima matrice (2x2): a00, a01, a10, a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// Leggi l'input per la seconda matrice (2x2): b00, b01, b10, b11
int b00, b01, b10, b11;
cin >> b00 >> b01 >> b10 >> b11;
// TODO: Crea due oggetti Matrix (2 righe e 2 colonne ciascuno)
// TODO: Popola le matrici usando il metodo set()
// TODO: Stampa Matrix A
// cout << "Matrix A:" << endl;
// Usa l'operatore << per stampare la matrice
// TODO: Stampa Matrix B
// cout << "Matrix B:" << endl;
// Usa l'operatore << per stampare la matrice
// TODO: Stampa A + B
// cout << "A + B:" << endl;
// TODO: Stampa A - B
// cout << "A - B:" << endl;
// TODO: Visualizza i risultati del confronto
// cout << "A == B: " << (usa l'operatore ternario per true/false) << endl;
// cout << "A != B: " << (usa l'operatore ternario per true/false) << endl;
// TODO: Visualizza i risultati dell'accesso tramite indice
// cout << "A[0][0]: " << ... << endl;
// cout << "A[1][1]: " << ... << endl;
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online