Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Quando si crea una nuova classe..
Forum - C/C++ - Quando si crea una nuova classe..

Avatar
Butterfly (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/07/2010

Segnala al moderatore
Postato alle 14:41
Mercoledì, 07/07/2010
è sempre opportuno inserire sia un costruttore predefinito che uno con parametri? perchè?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6379
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:48
Mercoledì, 07/07/2010
No ... chi te lo ha detto?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Butterfly (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/07/2010

Segnala al moderatore
Postato alle 14:50
Mercoledì, 07/07/2010
Nessuno,solo che in tutti gli esercizi che ho fatto erano presenti entrambi,e mi chiedevo se fosse solo una coincidenza. Quindi come dovrei regolarmi?

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:21
Mercoledì, 07/07/2010
Testo quotato

Postato originariamente da Butterfly:

Nessuno,solo che in tutti gli esercizi che ho fatto erano presenti entrambi,e mi chiedevo se fosse solo una coincidenza. Quindi come dovrei regolarmi?



se la classe ha bisogno di inizializzare dei campi interni o delle strutture di dati interne basandosi su dati esterni, passi quei dati nel costruttore.
Se non ha bisogno di dati esterni ma deve solo creare/inizializzare degli oggetti interni si usa il costruttore senza parametri (che ovviamente sovrascrive quello di default).

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:25
Mercoledì, 07/07/2010
Ti faccio 3 esempi di classici utilizzi dei costruttori con parametri, in modo che ti possa fare un'idea:

- Costruttore per copia: passi come parametro un const reference ad un oggetto dello stesso tipo. Durante la costruzione verranno copiati tutti i membri e verranno eseguite tutte le operazioni necessarie per utilizzare il nuovo oggetto. Se l'oggetto di partenza contiene dei puntatori, con questo metodo è possibile allocare nuova memoria e copiare il contenuto dei rispettivi buffer, anzichè copiare i puntatori (cosa che renderebbe i due oggetti in qualche modo interdipendenti).
Codice sorgente - presumibilmente C/C++

  1. MyString::MyString(const MyString& copiami)
  2. {
  3.   m_uiSize = copiami.m_uiSize;
  4.   m_pData = new char[m_uiSize];         // creo un nuovo buffer, invece di linkare a quello vecchio
  5.   memcpy(m_pData, copiami.m_pData, m_uiSize); // creo una copia dei dati nel nuovo buffer
  6. }



- Oggetto con ID univoco: se l'oggetto viene creato da un'apposita Factory, ci sarà probabilmente la necessità di assegnarli un ID univoco (anche un semplice unsigned int può andare bene). Questo ID non potrà più essere modificato, ma soltanto letto.
Codice sorgente - presumibilmente C++

  1. UIWidget::UIWidget(unsigned int id)
  2. {
  3.   m_ID = id;   // m_ID è privato
  4. }
  5.  
  6. // creo il getter, ma non il setter
  7. unsigned UIWidget::getID() const
  8. {
  9.   return m_ID;
  10. }
  11.  
  12. // Per evitare duplicazioni di oggetti con ID uguali, dichiaro un costruttore per copia come privato, la cui implementazione è vuota.
  13. class UIWidget
  14. {
  15. //...
  16. private:
  17.   UIWidget(const UIWidget& other) {}
  18. //...
  19. };




- Costruzione per conversione: Se voglio convertire un oggetto dal tipo A al tipo B, posso prevedere un costruttore che richiede come parametro un reference (o un puntatore) ad un oggetto di tipo A. Un esempio arcistrausato è questo:
Codice sorgente - presumibilmente C/C++

  1. MyString::MyString(const char *szCopiami)
  2. {
  3.   m_uiSize = strlen(szCopiami) + 1;   // misuro la stringa
  4.   m_pData = new char[m_uiSize];       // alloco lo spazio necessario
  5.   strcpy(m_pData, szCopiami, m_uiSize);  // copio i dati
  6. }



Ci possono essere tanti altri utilizzi, ma il succo del discorso è che devi sfruttare a tuo vantaggio quello che il linguaggio ti offre. Non scrivere codice a casaccio, senza prima riflettere sui possibili modi in cui questo codice verrà usato. :k:

PM Quote
Avatar
Butterfly (Normal User)
Newbie


Messaggi: 3
Iscritto: 07/07/2010

Segnala al moderatore
Postato alle 15:49
Mercoledì, 07/07/2010
ok! grazie per l'aiuto ;)

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 22:18
Mercoledì, 07/07/2010
però ci sono alcune precisazioni da fare sui due costruttori.

-costruttore senza parametri: viene usato per creare array di oggetti quindi in teoria bisogna stare attenti a che tipi di dati ci sono salvati nella classe.

-costruttore copia: importante dato che entra in gioco nel passaggio parametri ad una funzione/metodo. Senza un costruttore copia scritto a mano il compilatore ne inserisce uno di default che copia i dati bit per bit, provocando quindi possibili collegamenti tra classi non voluti.

In definitiva secondo me è sempre meglio metterli, tanto non si sbaglia.

PM Quote