Modelli C ++

In questo articolo imparerai a conoscere i modelli in C ++. Imparerai a usare la potenza dei modelli per la programmazione generica.

I modelli sono potenti funzionalità di C ++ che ti consentono di scrivere programmi generici. In termini semplici, è possibile creare una singola funzione o una classe per lavorare con diversi tipi di dati utilizzando i modelli.

I modelli vengono spesso utilizzati in una base di codice più grande allo scopo di riutilizzare il codice e flessibilità dei programmi.

Il concetto di modelli può essere utilizzato in due modi diversi:

  • Modelli di funzioni
  • Modelli di classe

Modelli di funzioni

Un modello di funzione funziona in modo simile a una funzione normale, con una differenza fondamentale.

Un singolo modello di funzione può funzionare con diversi tipi di dati contemporaneamente, ma una singola funzione normale può funzionare solo con un insieme di tipi di dati.

Normalmente, se è necessario eseguire operazioni identiche su due o più tipi di dati, si utilizza il sovraccarico di funzioni per creare due funzioni con la dichiarazione di funzione richiesta.

Tuttavia, un approccio migliore sarebbe utilizzare i modelli di funzione perché è possibile eseguire la stessa attività scrivendo meno codice e gestibile.

Come dichiarare un modello di funzione?

Un modello di funzione inizia con il modello di parola chiave seguito dal parametro / i modello / i all'interno del quale è seguito dalla dichiarazione di funzione.

 template < class T> T someFunction (T arg) (…)

Nel codice precedente, T è un argomento del modello che accetta diversi tipi di dati (int, float) e class è una parola chiave.

Puoi anche usare la parola chiave typenameinvece della classe nell'esempio sopra.

Quando viene passato un argomento di un tipo di dati someFunction( ), il compilatore genera una nuova versione di someFunction()per il tipo di dati specificato.

Esempio 1: modello di funzione per trovare il numero più grande

Programma per visualizzare il più grande tra due numeri utilizzando i modelli di funzione.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Produzione

Immettere due numeri interi: 5 10 10 è maggiore. Immettere due numeri in virgola mobile: 12,4 10,2 12,4 è maggiore. Immettere due caratteri: z Z z ha un valore ASCII maggiore.

Nel programma precedente, Large()viene definito un modello di funzione che accetta due argomenti n1 e n2 di tipo di dati T. Tsignifica che l'argomento può essere di qualsiasi tipo di dati.

Large() restituisce il più grande tra i due argomenti utilizzando una semplice operazione condizionale.

All'interno della main()funzione di variabili di tre diversi tipi di dati: int, floate charsono dichiarati. Le variabili vengono quindi passate al Large()modello di funzione come normali funzioni.

Durante l'esecuzione, quando un intero viene passato alla funzione template, il compilatore sa che deve generare una Large()funzione per accettare gli argomenti int e lo fa.

Allo stesso modo, quando vengono passati dati in virgola mobile e dati char, conosce i tipi di dati dell'argomento e genera la Large()funzione di conseguenza.

In questo modo, l'utilizzo di un solo modello di funzione ha sostituito tre funzioni normali identiche e ha reso il codice gestibile.

Esempio 2: scambio di dati utilizzando modelli di funzione

Programma per scambiare dati utilizzando modelli di funzione.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Produzione

Prima di passare i dati al modello di funzione. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Dopo aver passato i dati al modello di funzione. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

In questo programma, invece di chiamare una funzione passando un valore, viene emessa una chiamata per riferimento.

Il Swap()modello di funzione accetta due argomenti e li scambia per riferimento.

Modelli di classe

Come i modelli di funzione, puoi anche creare modelli di classe per operazioni di classe generiche.

A volte, è necessaria un'implementazione della classe uguale per tutte le classi, solo i tipi di dati utilizzati sono diversi.

Normalmente, è necessario creare una classe diversa per ogni tipo di dati OPPURE creare variabili membro e funzioni diverse all'interno di una singola classe.

Ciò gonfierà inutilmente la tua base di codice e sarà difficile da mantenere, poiché una modifica è una classe / funzione dovrebbe essere eseguita su tutte le classi / funzioni.

Tuttavia, i modelli di classe semplificano il riutilizzo dello stesso codice per tutti i tipi di dati.

Come dichiarare un modello di classe?

 template < class T> class className (… public: T var; T someOperation (T arg);…);

Nella dichiarazione precedente, Tè l'argomento del modello che è un segnaposto per il tipo di dati utilizzato.

All'interno del corpo della classe, una variabile membro var e una funzione membro someOperation()sono entrambe di tipo T.

Come creare un oggetto modello di classe?

Per creare un oggetto modello di classe, è necessario definire il tipo di dati all'interno di un file durante la creazione.

 className classObject; 

Per esempio:

className classObject; className classObject; className classObject;

Esempio 3: semplice calcolatrice utilizzando il modello di classe

Programma per aggiungere, sottrarre, moltiplicare e dividere due numeri utilizzando il modello di classe

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Produzione

Risultati Int: i numeri sono: 2 e 1. La somma è: 3 La sottrazione è: 1 Il prodotto è: 2 La divisione è: 2 Risultati flottanti: I numeri sono: 2.4 e 1.2. La somma è: 3.6 La sottrazione è: 1.2 Il prodotto è: 2.88 La divisione è: 2

Nel programma precedente, Calculatorviene dichiarato un modello di classe .

La classe contiene due membri privati ​​di tipo T: num1 e num2 e un costruttore per inizializzare i membri.

Contiene anche funzioni membro pubbliche per calcolare l'addizione, la sottrazione, la moltiplicazione e la divisione dei numeri che restituiscono il valore del tipo di dati definito dall'utente. Allo stesso modo, una funzione displayResult()per visualizzare l'output finale sullo schermo.

Nella main()funzione vengono creati due diversi Calculatoroggetti intCalce floatCalcper i tipi di dati: inte floatrispettivamente. I valori vengono inizializzati utilizzando il costruttore.

Notare che usiamo e durante la creazione degli oggetti. Indicano al compilatore il tipo di dati utilizzato per la creazione della classe.

Questo crea una definizione di classe ciascuno per inte float, che vengono quindi utilizzati di conseguenza.

Quindi, displayResult()di entrambi gli oggetti viene chiamato che esegue le operazioni di Calcolatrice e visualizza l'output.

Articoli interessanti...