PDA

Visualizza la versione completa : [C++] Domande notazione e non...


beppe86
15-01-2006, 11:20
Ciao a tutti sono nuovo... parto subito con un quesito :zizi:
Per motivi universitari mi sto ricimentando sul C++ dopo 3 anni e mi sono trovato un pò spiazzato a recuperare "tutte" le mie conoscenze... Ciò non toglie che mi sono sorti dei grossi dubbi ad esempio guardando questo pezzo di programma... Mi sapete dare qualche spiegazione a riguardo? pls

#include<iostream>
using namespace std;
template<unsigned int N, class T> //Questo è buio totale... cos'è? il template cosa fa?
class A
{
T a[N];
int c;
public:
A() : c(0){} //Questa dichiarazione del costruttore? Conoscevo solo il tipo A(){...}
void p (T x){a[c++]=x;} //Il parametro formale cos'è? Una variabile di tipo T?
T g(){return a[--c];} //Questo?... un metodo di tipo T?!
void print()
{
for(int i=0;i<c;i++)
cout<<a[i]<<"";
cout<<endl;
}
};

XWolverineX
15-01-2006, 12:12
#include<iostream>
using namespace std;
template<unsigned int N, class T> //Questo è buio totale... cos'è? il template cosa fa?
class A
{
T a[N];
int c;
public:
A() : c(0){} //Questa dichiarazione del costruttore? Conoscevo solo il tipo A(){...}
void p (T x){a[c++]=x;} //Il parametro formale cos'è? Una variabile di tipo T?
T g(){return a[--c];} //Questo?... un metodo di tipo T?!
void print()
{
for(int i=0;i<c;i++)
cout<<a[i]<<"";
cout<<endl;
}
};

La tua diffcoltà principale è sul template.
I template in C++ permettono di scrivere programmi riutilizzabili.
template <class T> dichiara un template T
Ora se tu hai una funzione

void print (T stampa){cout << T;}
Grazie al template dichiarato, al valore di T potrai sostituire qualsiasi tipo di dato, che sia esso int, float, char, double e persino dati definiti dall'utente (se ne hai fatto l'overloading)


int a = 0;
float b = 3.5f;
double c = 3.54;
MiaClasse e;
MiaStruct f;
print (a);
print (b);
print (c);
print (e);
print (f);

Grazie al template il programma funzionerà correttamente.
(Per i dati definiti dall'utente devi però fare l'overloading)

Per quanto riguarda il template a due entrate (cio è quello del tuo codice) non saprei proprio dire a che serve.

beppe86
15-01-2006, 12:30
Quello che ho postato è solo una parte di codice, dopo si spiega il problema del template a due ingressi.

Però mi sfugge ancora una cosa:

template <class T>
void print (T stampa){cout << T;}

Cioè probabilmente il mio dubbio è stupido ma... la classe T secondo quale logica è definita?
Il parametro T stampa cosa è?

Cmq c'è qualche link su i Template... sul libro di testo dell'università non ne parlano minimamente :stordita:

XWolverineX
15-01-2006, 12:40
MMM allora...
I template sono una delle caratteristiche piu' potenti e versatili del C++ che è presente in ben pochi linguaggi di programmazioni orientati agli oggetti. Questo meccanismo consente di specificare in un solo segmento di codice il modello di un vasato inseme di funzioni o di classi correlate.
Si può scrivere, ad esempio, un template di funzione per l'ordinamento di un array, ordinando al compilatore di generare automaticamente le diverse funzioni della funzione che trattano diversi tipi di dati concreti. In un certo senso i template definiscono funzioni o classi che si possono adattare a diversi tipi di dato.
Possiamo anche ad esempio ordinare un template di classe che generi una pila, ordinando poi in seguito al compilatore di generare il codice necessario per fare una pila di int, pila di float, di string...

pprllo
15-01-2006, 12:48
Originariamente inviato da beppe86
Quello che ho postato è solo una parte di codice, dopo si spiega il problema del template a due ingressi.

Però mi sfugge ancora una cosa:

template <class T>
void print (T stampa){cout << T;}

Cioè probabilmente il mio dubbio è stupido ma... la classe T secondo quale logica è definita?
Il parametro T stampa cosa è?

Cmq c'è qualche link su i Template... sul libro di testo dell'università non ne parlano minimamente :stordita:
La classe T è definita dinamicamente al momento dell'uso del template. Per esempio, volendo usare un int, scriveresti:


int a;
print<int>(a);

beppe86
19-01-2006, 10:48
:dhò: io continuo a non capire in pieno il template... ad esempio:

#include<iostream>
using namespace std;

template<class tipo>
class uno
{
int a;
public:
uno(tipo x){a = x;}
tipo valore(){return a;}
};

template<class tipo>
void f(uno<tipo>& obj, tipo& y)
{
y=obj.valore();
}

int main()
{
int h;
char c;
uno<int>obj1(5);
uno<char>obj2('m');
f(obj1,h);
f(obj2,c);
cout<<h<<endl<<c<<endl;
system("pause");
return 0;
}



Questo è uno dei programmi che ha dato la profe sul template.
Io non capisco la classe tipo... cioè che senso ha dichiarare, richiamare e lavorare su una classe che non si sa nemmeno come è fatta e che metodi ha?:confused:

Sicuramente sono io che non ho capito il template... provate ad aiutarmi per favore che l'esame si avvicina :stordita:

newbie
20-01-2006, 11:25
Esempio pratico: Supponi di scrivere un'applicazione in cui hai bisogno di una classe "Punto" per contenere le coordinate di un pixel sullo schermo (magari per un programma tipo Paint), le cui coordinate, quindi, saranno *numeri interi*. La classe, presumibilmente, sarebbe



//file Punto.h
class Punto
{
public:
Punto(int x, int y); //costruttore
void Stampa(); //stampa il punto
(...altri metodi utili...)
private:
int x;
int y;
};


Supponi ora di voler scrivere un programma che debba modellare un piano cartesiano vero e proprio (che ne so, un programma di studio di funzioni o simile). Anche in questo caso avresti bisogno di un "Punto", ma le cui coordinate debbano essere *numeri decimali*, diciamo dei float. Se non esistessero i template, dovresti prendere il file "Punto.h" e riadattarlo, sostituendo tutti gli "int" con dei "float". Tutto il resto del codice resterebbe invariato.
I template ti permettono invece di definire, in questo caso, una classe Punto le cui coordinate sono di un tipo che... decidi tu. In codice, si avrebbe



//definizione classe
template<class TipoCoord>
class Punto
{
public:
Punto(TipoCoord x, TipoCoord y); //costruttore
void Stampa(); //stampa il punto
private:
TipoCoord x;
TipoCoord y;
};

//... nel codice in cui si usa...
Punto<int> p(3, 4); //punto con coordinate intere
Punto<float> p(3.5, 7.88); //punto con coordinate decimali


Un comodissimo esempio di uso dei template sono le classi contenitore STL, coms list, la lista. Se non esistessero i template, avresti listOfInt, listOfFloat, listOfString... tutte con codice quasi identico!
Cool, eh? http://forum.html.it/forum/faccine/gren.gif

Loading