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 :

Signification de never throw


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Signification de never throw
    bonjour

    que signifie le terme "never throw". On le voit souvent dans les librairies boost.

    http://www.boost.org/doc/libs/1_44_0...m#constructors

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Qu'il ne lancera jamais d'exception.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Cela n'a rien a voir avec le message précédent, mais j'aimerais savoir s'il est possible de convertir un pointeur en un autre, qui n'a rien a voir. Par exemple, avec les deux classes suivantes: A et B. On voit que la conversion d'un objet A un élément B fonctionne. Mais la conversion d'un pointeur vers un objet A en un pointeur vers un objet B me renvoie le message:

    Error 1 error C2440: '=' : cannot convert from 'A *' to 'B *'

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    class B{
    	friend class A;
    private:
    	int Barg1;
    public:
    	B(){};
    	B(int o):Barg1(o){};
     
    };
     
    class A{
    private:
    	int arg1;
    	int arg2;
    public:
    	A(int o,int r):arg1(o),arg2(r){};
    	 operator B();
    	 operator B*();
    };
    A::operator B(){//conversion de A en B. 
    	B b;
    	b.Barg1=this->arg2;
    	return b;
    }
     
    A::operator B*(){//conversion de A* en B*. 
    	B b;
    	b.Barg1=arg2;
    	return &b;
    }
     
    void main(){
       A g(2,3);
       B f;
       f=g;//OKKKKKKKK
     
     
     
       A* ptra=new A(2,3);
       B* ptrb=0;
       ptrb=ptra;  ////pas okkkkkkkkkk
    }

    Alors est il possible de faire cela?
    Merci

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Plusieurs remarques.

    Intérêt de pouvoir faire ca ? les conversions pointeurs<->pointeurs sont en général à moitié casse geule (surtout en cas de downcasting) mais je vois _vraiment_ pas l'intérêt de faire du cross-casting (pas d'autres terme sous le clavier)

    Dans A::operator B*, tu renvois l'adresse d'une variable locale. Dans l'hypothèse où ton code serait juste, si tu la récupérerais et que tu l'utilisais: boom.

    Enfin, il faut comprendre que tes fonctions de conversions sont pour que des OBJETS se transforme en pointeur. Là tu essayes d'affecter un PoINTEUR à un autre pointeur d'un type différent sans lien d'héritage quelconque entre tes cllasses. Ca coince et c'est normal. ptrb=*ptra; marchera beaucoup mieux.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    en fait, il suffit de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     B* aa=0;
       aa=(B*)(&g);
    Dans A::operator B*, tu renvois l'adresse d'une variable locale. Dans l'hypothèse où ton code serait juste, si tu la récupérerais et que tu l'utilisais: boom.
    exacte


    Enfin, il faut comprendre que tes fonctions de conversions sont pour que des OBJETS se transforme en pointeur. Là tu essayes d'affecter un PoINTEUR à un autre pointeur d'un type différent sans lien d'héritage quelconque entre tes cllasses. Ca coince et c'est normal. ptrb=*ptra; marchera beaucoup mieux.
    c'est pas un peu ce que tu fais quand tu transforme un double en int? Il n'y a a priori pas de relation d'héritage.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    en fait, il suffit de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     B* aa=0;
       aa=(B*)(&g);
    Là tu forces le cast avec un cast C-like. ces derniers sont à bannir car tu peux faire tout et n'importe quoi. Surtout n'importe quoi d'ailleurs.

    Dans le cas où tu écris A::operator B*, tu considères que TOUT objet de type A peut être converti en un pointeur de type B.

    Si tu veux juster caster pour un objet particulier, utilise reinterpret_cast.


    c'est pas un peu ce que tu fais quand tu transforme un double en int? Il n'y a a priori pas de relation d'héritage.
    Pas pareil. Ce sont deux types définis par la norme et je ne serais pas étonné que les conversions autorisées soit explicitées dedans.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/09/2004, 12h01
  2. [Mots cles]Signification de transient et volatile
    Par Pill_S dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2004, 11h58
  3. Réponses: 4
    Dernier message: 22/01/2004, 08h27
  4. Recherche la signification d'expressions en C
    Par sbadecoder dans le forum C
    Réponses: 16
    Dernier message: 20/08/2003, 07h35
  5. i386, x86 signification ?
    Par Thcan dans le forum Assembleur
    Réponses: 7
    Dernier message: 04/01/2003, 21h36

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