Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [C++] Gestire eccezioni costruttore

    Mi stavo ponendo il problema di come cautelarmi nei confronti di possibili fallimenti del costruttore di un oggetto.

    Ho fatto questo codice di prova:

    codice:
    class Prova
    {
     public:
       Prova(std::vector<int> values)
       {
           try
           {
             if(values.size()!=3)
             {
               throw 0;
             }
             else
             {
               a=values[0];
               b=values[1];
               c=values[2];
             }
           }
           catch(...)
           {
            std::cout<<"\nImpossibile costruire prova!";   
           }
       };
       void view()
       {
           std::cout<<"\nvalore di a: "<<a;
           std::cout<<"\nvalore di b: "<<b;
           std::cout<<"\nvalore di c: "<<c;
       };
    
     private:
       int a;
       int b;
       int c;
    };
    
    int main()
    {
    
        Prova prova(std::vector<int> {1,2,3,4,5,6});
        prova.view();
    
    
    }

    ed ottengo il seguente output

    Impossibile costruire prova!
    valore di a: 0
    valore di b: 0
    valore di c: 0

    nonchè i seguenti warning:


    In function 'int main()':
    33:39: warning: 'prova.Prova::c' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::c' was declared here
    32:39: warning: 'prova.Prova::b' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::b' was declared here
    31:39: warning: 'prova.Prova::a' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::a' was declared here

    e così non è un buon comportamento...ho dei valori per a,b e c quando invece l'oggetto non dovrebbe essere stato nemmeno creato.

    Mi pare piu' 'cautelativo' implementare l'eccezione nel seguente modo:

    codice:
    class Prova
    {
     public:
       Prova(std::vector<int> values)
       {
           
             if(values.size()!=3)
             {
               throw 0;
             }
             else
             {
               a=values[0];
               b=values[1];
               c=values[2];
             }
    
       };
       void view()
       {
           std::cout<<"\nvalore di a: "<<a;
           std::cout<<"\nvalore di b: "<<b;
           std::cout<<"\nvalore di c: "<<c;
       };
    
     private:
       int a;
       int b;
       int c;
    };
    
    int main()
    {
    
        try
        {
            Prova prova(std::vector<int> {1,2,3,4,5,6});
            prova.view();
        }
        catch(...)
        {
            std::cout<<"\nImpossibile costruire prova!";   
        }
    
    
    }
    Da cui ottengo il seguente output

    Impossibile costruire prova!

    Consigli, soprattutto legati alla possibilita' di casi futuri piu' complicati?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Usare eccezioni derivate da std::exception.
    codice:
    class Prova
    {
     public:
       Prova(const std::vector<int>& values)
       {
             if(values.size()!=3)
                throw std::logic_error("vector size must be 3!");
                         
             a=values[0];
             b=values[1];
             c=values[2];
    
       };
       void view()
       {
           std::cout<<"\nvalore di a: "<<a;
           std::cout<<"\nvalore di b: "<<b;
           std::cout<<"\nvalore di c: "<<c;
       };
    
     private:
       int a;
       int b;
       int c;
    };
    
    int main()
    {
    
        try
        {
            Prova prova(std::vector<int> {1,2,3,4,5,6});
            prova.view();
        }
        catch(std::exception& e)
        {
            std::cout<< e.what() << std::endl;   
        }
    
    
    }
    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.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Usare eccezioni derivate da std::exception.
    codice:
    class Prova
    {
     public:
       Prova(const std::vector<int>& values)
       {
             if(values.size()!=3)
                throw std::logic_error("vector size must be 3!");
                         
             a=values[0];
             b=values[1];
             c=values[2];
    
       };
       void view()
       {
           std::cout<<"\nvalore di a: "<<a;
           std::cout<<"\nvalore di b: "<<b;
           std::cout<<"\nvalore di c: "<<c;
       };
    
     private:
       int a;
       int b;
       int c;
    };
    
    int main()
    {
    
        try
        {
            Prova prova(std::vector<int> {1,2,3,4,5,6});
            prova.view();
        }
        catch(std::exception& e)
        {
            std::cout<< e.what() << std::endl;   
        }
    
    
    }
    Ogni volta che chiedo qualcosa spero sempre di trovare una tua risposta...Grazie
    E adesso sotto nuovamente a studiare...

    P.S.: grazie perchè non ti limiti a rispondere a quanto richiesto, ma riguardando il codice da te postato (vedi i piccioli aggustamenti del caso come aggiungere 'const', '&', ecc.), si vede che lo fai per far imparare gli altri a fare anche loro un passo avanti nella loro tecnica di programmazione. Grazie

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.