IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Copie d'une exception


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut Copie d'une exception
    Bonjour,

    Pourquoi faut il absolument qu'une exception puisse être copié ?

    Par exemple, le code suivant ne compile pas car le compilateur ne trouve pas le constructeur par recopie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #include <iostream>
    #include <sstream>
    #include <exception>
    #include <limits> 
     
    using namespace std;
     
    class MyException : public runtime_error
    {
       public :
          MyException( const char * what ) throw() : runtime_error( what ) {}
       private :
          MyException( const MyException & what ) throw();
          const MyException & operator=( const MyException & what ) throw();
    };
     
    int main()
    {
       try
       {
          throw( MyException( "because" ) );
       }
       catch( const exception & e )
       {
          cout << "main : " << e.what() << endl;
       }
     
       cout << "Appuyez sur entrée pour continuer...";
       cin.ignore( numeric_limits<streamsize>::max(), '\n' );
     
       return 0;
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Normal, tu le déclares mais tu ne le définis pas.
    Si tu veux pas le définir, ne le déclare pas...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    Je le définit en private justement pour éviter de faire des copies sans le savoir.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    D'après ce que je viens de lire de la norme, si la classe de l'objet lancé en exception ne possède pas de constructeur par recopie (ou de destructeur) accessible, le programme est malformé.


    L'explication qui me semble être à cela : un objet temporaire est créé par "MyException( "because" )". Un objet temporaire est ensuite alloué et construit avec le constructeur de recopie, c'est ce second objet qui est "lancé".

    (je ne sais pas si c'est clair)

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Oulaaah. Tu confonds déclaration et définition.
    Tu déclares un constructeur par recopie mais tu ne le définis pas.

    Si tu n'en déclares pas, la copie normale sera effectuée.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Extrait de la norme :

    If the use of the temporary object can be eliminated without changing the meaning of the program except for the execution of constructors and destructors associated with the use of the temporary object (12.2), then the exception in the handler can be initialized directly with the argument of the throw expression. When the thrown object is a class object, and the copy constructor used to initialize the temporary copy is not accessible, the program is illformed (even when the temporary object could otherwise be eliminated). Similarly, if the destructor for that object is not accessible, the program is illformed (even when the temporary object could otherwise be eliminated).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 31
    Par défaut
    Merci pour ces réponse.

    Ca explique pourquoi le compilateur de visual me disais que je n'avais pas le droit d'utiliser cet objet dans une exception.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. error 80020009 une exception s'est produite
    Par Riouxe21 dans le forum ASP
    Réponses: 6
    Dernier message: 21/12/2004, 11h01
  2. erreur :"une exception s'est produite"
    Par leborg dans le forum ASP
    Réponses: 11
    Dernier message: 02/03/2004, 15h09
  3. [JSP] Affichage numéro de ligne d'une exception
    Par PhoneKilleR dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 23/09/2003, 14h59
  4. Réponses: 2
    Dernier message: 28/08/2003, 00h00
  5. Réponses: 3
    Dernier message: 01/11/2002, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo