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

    [C++] Aiuto, costruttore di copia...

    Salve a tutti e auguri! Spero che qualcuno possa darmi una mano visto che ho cercato in lungo in largo senza capire quale sia il problema, che adesso spiego... Ho una classe dove ho necessità di avere più costruttori ed anche un costruttore di copia, ad esempio:
    codice:
    class test{
        public:
            test(int a){
                this->val = a;
            }
            test(test &a){
                this->val = a.val;
            }
        private:
            int val;
    };
    Quando provo poi dal main a scrivere:
    codice:
        ...
        test t1 = 5;
        ...
    in teoria, tale istruzione dovrebbe essere equivalente ad una chiamata a
    codice:
    test::test(5)
    . In realtà la chiamata viene effettuata solo se non metto il costruttore di copia, infatti commentandolo il codice gira ed inserendo un cout nel costruttore
    codice:
    test::test(int a)
    vedo che effettivamente è stato chiamato. Non appena decommento il costruttore di copia ricevo un errore dal compilatore del tipo
    codice:
    error: no matching function for call to test::test(test)
    se tuttavia chiamo esplicitamente il costruttore tramite
    codice:
    test t1(5)
    tutto va bene...
    Ricapitolando
    codice:
    class test{
        public:
            test(int a){
                this->val = a;
            }
            test(test &a){
                this->val = a.val;
            }
        private:
            int val;
    };
    
    int main(){
        test t1 = 5;    //non funziona
        test t2(5);     //funziona
    }
    Chiedo gentilmente aiuto se qualcuno di voi sa come risolvere il problema? Grazie in anticipo e nuovamente auguri!

  2. #2
    Il costruttore di copia riceve l'argomento per const reference:
    codice:
    class test{
        public:
            test(int a){
                this->val = a;
            }
            test(const test &a){
                this->val = a.val;
            }
        private:
            int val;
    };
    
    int main(){
        test t1 = 5;
        test t2(5);
    }
    ---
    Il punto è questo: quando tu scrivi
    codice:
    test t1 = 5;
    c'è di mezzo una chiamata al costruttore che accetta int e una chiamata al costruttore di copie; di fatto, è equivalente a:
    codice:
    test t1(test(5));
    In questo blocco, test(5) è un temporary, che non può essere passato per riferimento al tuo "costruttore di copie senza const" dato che i reference non const non possono bindare oggetti temporanei. Da lì l'errore.
    Amaro C++, il gusto pieno dell'undefined behavior.

Tag per questa discussione

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.