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
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
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)
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
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)
en fait, il suffit de faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 B* aa=0; aa=(B*)(&g);exacteDans 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.
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.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.
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.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 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.
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.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.
"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)
Partager