PDA

View Full Version : [C++] Dubbio su costruttore classe


theberto
01-09-2015, 00:58
Salve, avrei un dubbio sul costruttore non di default delle classi in c++.
vorrei sapere se è possibile dichiarare la variabile classe e poi in seguito chiamare il costruttore o se è necessario farlo durante la dichiarazione.
Ho questo dubbio poichè vorrei passare nel costruttore dei dati che ricevo da input, quindi non immediatamente disponibili.
Pensavo di utilizzare questo metodo

Classe c;
int a,b;
cin>>a;
cin>>b;
c(a,b);

è corretto utilizzare il costruttore di della classe 'c' in questo modo?
grazie mille

tomminno
01-09-2015, 10:29
No è sbagliato. Il costruttore serve a istanziare l'oggetto e devi usarlo alla creazione dell'oggetto. Hai 2 possibilità:

Classe * c;
int a,b;
cin>>a;
cin>>b;
c = new Classe(a,b);

oppure

int a,b;
cin>>a;
cin>>b;
Classe c(a,b);

theberto
01-09-2015, 12:00
Come mai devo mettere l'asterisco prima di 'c'?
grazie mille

theberto
01-09-2015, 14:18
è necessario inserire l'asterisco se voglio chiamare il costruttore dopo qualche istruzione?

come mai nell'altro caso non c'è l'asterisco?

grazie ancora :)

theberto
01-09-2015, 16:27
nel caso invece non avessi parametri nel costruttore potrei semplicemente fare così?

Classe c();
Int a,b;
cin>>a;
cin>>b;
c.set(a,b);

o posso anche omettere le parentesi di "c()"?

tomminno
01-09-2015, 17:10
Si ad entrambe le domande

71106
02-09-2015, 13:52
nel caso invece non avessi parametri nel costruttore potrei semplicemente fare così? [...] Puoi, ma non è RAII (https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization).

tomminno
02-09-2015, 15:08
Puoi, ma non è RAII (https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization).

Si ma non esageriamo, non è che qualunque cosa in ingresso ad una classe debba passare dal costruttore...

71106
02-09-2015, 19:30
Si ma non esageriamo, non è che qualunque cosa in ingresso ad una classe debba passare dal costruttore... Dovrebbe, poichè ciò consente di rendere l'oggetto immutabile. Lo stato è il male. Ti rimando a letture di tua scelta circa i vantaggi dell'immutabilità e di come il paradigma RAII si renda conseguentemente necessario.

tomminno
03-09-2015, 09:55
Dovrebbe, poichè ciò consente di rendere l'oggetto immutabile. Lo stato è il male. Ti rimando a letture di tua scelta circa i vantaggi dell'immutabilità e di come il paradigma RAII si renda conseguentemente necessario.

Quindi secondo te anche la classe std::vector è sbagliata perchè ha il metodo push_back e tutti gli elementi del vettore dovrebbero essere sempre passati sul costruttore?
Gli stream dovrebbero accettare sul costruttore tutti i dati letti o scritti sullo stream?
Gli esempi si sprecano...

Non è proprio questo il senso del RAII che ha più a che fare con la corretta gestione della memoria, specialmente in caso di eccezioni, dato che una delle poche garanzie che il C++ dà allo sviluppatore è che il distruttore viene sempre richiamato.

71106
06-09-2015, 11:02
Gli esempi che citi sono fatti per fornire gestione dello stato qualora questo sia irrimediabilmente richiesto dalle specifiche. Supponi ad esempio che sia espressamente richiesto di creare una GUI che permetta all'utente di inserire un numero arbitrario di elementi in una lista, rimuoverne alcuni precedentemente inseriti, ecc., senza avere la possibilità di affidarsi ad altri meccanismi sottostanti (p.es. senza poter salvare nulla nel file system e senza poter inviare nulla a un server esterno).

Ma in tutti gli altri casi l'immutabilità dovrebbe sempre essere preferita, i benefici in fase di diagnostica o in termini di leggibilità del codice sono interminabili.