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

    [C++] problema con struct

    Ciao a tutti,
    vi pongo una semplice domanda riguardo il linguaggio C++.
    Se mi trovo davanti una struttura definita in questo modo:

    struct my_struct
    {
    .....
    my_struct();
    .....
    private:
    my_struct( const my_struct & )
    }

    cosa sta a significare la funzione privata my_struct? O meglio, che significa passare come parametro solo &? io di solito passo o puntatori (int *a) o indirizzi (int &a) ma la & da sola che significa in questo caso?
    Grazie a tutti!

  2. #2
    Nei prototipi puoi omettere il nome del parametro; è un normale passaggio per reference (o indirizzo come lo chiami tu).
    In particolare, quella funzione è un costruttore di copie; il fatto che sia privato e non definito indica che si tratta del classico idioma per disattivare il costruttore di copie predefinito generato dal compilatore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ti ringrazio per la risposta rapida e chiara.
    Ho solo un dubbio sull'ultima tua affermazione. Cosa significa in parole più semplici "si tratta del classico idioma per disattivare il costruttore di copie"?
    Grazie!

  4. #4
    struct your_struct
    {
    .....
    your_struct();
    .....
    }


    /// Nel programma

    your_struct a;
    your_struct b = a; // OK

    my_struct c;
    my_struct d = c; // ERRORE (in compilazione)
    // il costruttore per copia di my_struct
    // è privato e non può essere invocato

    my_struct d;
    d = c; // OK: non copia ma assegnazione .
    // Vuoi evitare anche l'assegnazione?
    // Devi ridefinire anche l'operatore =

    /// Nel programma

    struct my_struct
    {
    .....
    my_struct();
    .....
    private:
    my_struct( const my_struct & );
    my_struct& my_struct:perator=( const my_struct& );
    }

    /// CODICE.....

    my_struct c;
    my_struct d = c; // ERRORE (in compilazione)

    my_struct d;
    d = c; // ERRORE (in compilazione)

  5. #5
    In C++ quando non dichiari un tuo costruttore di copie il compilatore ne genera uno automaticamente, che crea una copia del tuo oggetto bit-a-bit ("shallow copy"); spesso però questo tipo di copia non è adeguato.
    Pensa ad esempio ad un oggetto che ha dei campi puntatori che deve deallocare nel distruttore: il costruttore di copie di default copierebbe semplicemente i puntatori, e ciascuno dei due distruttori distruggerebbe gli stessi puntatori - si ha un problema di double free.
    D'altra parte spesso e volentieri la logica di deep copy è complessa da implementare, o banalmente non si prevede di copiare la classe in questione, per cui si vorrebbe semplicemente disattivare il costruttore di copie di default, in modo da ottenere semplicemente un errore di compilazione nel caso in cui si tenti di copiare un oggetto di tale tipo.
    Il modo più usato per fare ciò è dichiarare il costruttore di copie come privato e non implementarlo. In questa maniera il costruttore di copie di default non viene generato, ma ogni tentativo di copia (ossia, di richiamare il costruttore di copie) fallisce con un errore di compilazione dato che il costruttore di copie è privato. Se anche la copia viene effettuata da codice che ha la possibilità di chiamare metodi privati (ad esempio classi friend) si ottiene un errore di linking dato che il costruttore di copie non è effettivamente implementato.

    Nella futura versione dello standard C++ è previsto un modo esplicito per disattivare la creazione automatica del costruttore di copie: sarà infatti possibile scrivere:
    codice:
    struct my_struct
    {
        // ...
        my_struct( const my_struct & ) = delete;
    };
    (link)

    Nota che tutto questo si applica (mutatis mutandis) anche ai costruttori di default e agli operatori di assegnamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.