Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Puntatore this e costruttori di copia [dibattito con prof in corso!]

    Salve ragazzi,

    la faccio molto breve. Ho un costruttore di copia per una classe chiamata Sportello, ed è dichiarato nel seguente modo:
    codice:
    Sportello(const Sportello& t);
    Cercando di fare i piu controlli possibili aggiunsi una riga all'interno della definizione dell'costr. di copia per far si che non si possa cercare di usare il costruttore di copia sull'oggetto stesso che lo chiama, cioè la seguente cosa:
    codice:
    Sportello s (s);
    il controllo è il seguente:

    codice:
    if(this==&t) {//blibliblabla}
    che funziona l'ho visto al sicuro perché dopo quando cercavo di fare Sportello s (s) mi faceva quel che ho messo dentro l'if (un cout), volevo sapere se però è un errore logico o qualcosa del genere, e se non lo è allora come si può spiegare per bene il funzionamento di questo codice.

    Questo perché questa cosa l'ho fatta in un esame dell'uni e la professoressa me lo ha segnato come errore dicendo che è un errore logico e che non funzionerebbe(ma non è vero perché l'ho visto con i miei occhi che funziona, pero lei corregge su carta e quindi non ha avuto modo di testarlo).. Dopo un breve dibattito ha concluso dicendo che sarebbe andata a riguardare il funzionamento dei costruttori di copia e dell'this, ma siccome ho paura non lo faccia voglio prepararmi per affrontare nuovamente la discussione cercando di portare ragionamenti più persuasivi del "ma le dico che funzionava!".

    Grazie in anticipo a chi ne capisce più che di me e mi da una mano..

  2. #2
    In linea di principio potresti avere ragione tu, dal momento che il nome dell'oggetto inizia ad esistere già da prima dell'inizializzazione - leggi qui; d'altra parte, lo standard non è così chiaro in proposito, in effetti il passaggio dell'oggetto non ancora costruito al costruttore di copie si potrebbe qualificare come l'inizializzazione di un reference con un oggetto non valido (in quanto non ancora costruito). Diciamo che è un'area grigia del linguaggio.

    Questo a livello di standard. Per quanto riguarda il codice effettivamente generato, dato che, come detto, il nome dell'oggetto può essere usato nell'espressione di inizializzazione, il compilatore in linea di massima genererà codice che si comporta come hai avuto modo di sperimentare (se lo standard non proibisce esplicitamente qualcosa chi scrive compilatori in genere non sta a creare "casi ad-hoc" per cose così di nicchia).

    In ogni caso, cercare di difendere il proprio codice in maniera così maniacale è solo una perdita di tempo: se qualcuno chiama il costruttore di copie in quella maniera sa di stare andando quasi sicuramente in undefined behavior, dato che sta passando in giro un oggetto ancora non costruito. Se il codice chiamante vuole esplicitamente spararsi sui piedi che faccia pure.

    Il test che dici invece ha senso nel caso dell'operatore di assegnamento, dove è decisamente possibile (inavvertitamente o meno) assegnare un oggetto a sé stesso. Ma in verità l'unico modo per gestire correttamente costruttore di copie, operatore di assegnamento e distruttore è usare l'idioma del copy and swap, tutti gli altri sistemi in genere hanno falle di vario tipo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da MItaly Se il codice chiamante vuole esplicitamente spararsi sui piedi che faccia pure.
    Il che mi ricorda:
    C: Ti spari ad un piede.
    C++: Accidentalmente crei una dozzina di istanze di te stesso che ti sparano ad un piede. Procurarsi un' assistenza medica di emergenza è impossibile, fino a quando non sai quali sono le copie e quali sono quelle che puntano ad altre dicendo, "Hei, sono io! Sono Qua!."

    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Originariamente inviato da shodan
    Il che mi ricorda:
    C: Ti spari ad un piede.
    C++: Accidentalmente crei una dozzina di istanze di te stesso che ti sparano ad un piede. Procurarsi un' assistenza medica di emergenza è impossibile, fino a quando non sai quali sono le copie e quali sono quelle che puntano ad altre dicendo, "Hei, sono io! Sono Qua!."

    Inoltre quando finalmente arriva il medico inizia a medicarti il braccio: dal momento che non c'è un'ABI standard, il dottore crede che si tratti del piede.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ritengo che, mentre per l'operatore = è necessario evitare il "self assignment", non lo è - logicamente - per il costruttore di copia, perché questo viene effettivamente usato per costruire un nuovo oggetto che, in quanto nuovo, *non esiste* in precedenza per poterlo copiare (qui sconfiniamo in filosofia).

    Ritengo che sia sensato il comportamento di Visual C++ che indica come inesistente l'oggetto a destra in

    oggetto ogg(ogg);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: Puntatore this e costruttori di copia [dibattito con prof in corso!]

    Originariamente inviato da alexbu92
    [...]Questo perché questa cosa l'ho fatta in un esame dell'uni e la professoressa me lo ha segnato come errore dicendo che è un errore logico e che non funzionerebbe(ma non è vero perché l'ho visto con i miei occhi che funziona, pero lei corregge su carta e quindi non ha avuto modo di testarlo).. Dopo un breve dibattito ha concluso dicendo che sarebbe andata a riguardare il funzionamento dei costruttori di copia e dell'this[...]

    Questo mi è familiare

  7. #7
    ok quindi il controllo funziona ma non ha molto senso farlo?

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ha senso quanto svuotare l'oceano con un cucchiano da caffé.
    Tra l'altro in tanti anni che uso C++ sei il primo che si pone il problema del costruttore di copia.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.