Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > Les mots clefs > Lecture du sujet

Les mots clefs

Rédaction ici

Vous devez être inscrit pour pouvoir poster des messages

Page : Précédente  1  2  3  4  5  6  7  Suivante
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : Précédente  1  2  3  4  5  6  7  Suivante
Hors ligne Hiura # Posté le 01/05/2008 à 13:35:27
Avatar
Groupe : Membres
Reprise du dernier message de la page précédente :
Constante ou pas?
 
Hors ligne MatteX # Posté le 01/05/2008 à 17:25:28
The cake is a lie!
Avatar
Groupe : Membres
Non constante

De toute façon il est impossible de modifier un std::type_info et toutes les méthodes accessibles sont déclarées constantes alors cela ne change rien à l'utilisation.

liens utiles: FAQ C++ (developpez.com) | GotAPI.com | H-Deb
Mon futur ex-blog | Logique : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Propriétaire d'un Dell Inspiron 1720, Core 2 Duo 2.4Ghz, 3Go DDR2, 8600M GT 256Mo. Avec Blu-Ray!
 
Hors ligne Davidbrcz # Posté le 01/05/2008 à 17:58:05
Geek un jour, geek toujours !
Avatar
Groupe : Membres
5.2.8:1§
Citation : Pas de titre

The result of a typeid expression is an lvalue of static type const std::type_info (18.5.1) and dynamic type const std::type_info or const name where name is an implementation-defined class derived from std::type_info which preserves the behavior described in 18.5.1.61) The lifetime of the object referred to by the lvalue extends to the end of the program. Whether or not the destructor is called for the type_info object at the end of the program is unspecified.

Donc référence constante
Édité le 01/05/2008 à 18:00:37 par Davidbrcz

Partager grâce à l'open source et aux logiciels libres.

Mes articles sur developpez.com : http://come-david.developpez.com/

Da Nyug
 
Hors ligne Hiura # Posté le 02/05/2008 à 00:18:15
Avatar
Groupe : Membres
Merci, màj.
 
Hors ligne nono212 # Posté le 31/05/2008 à 13:33:12
Euh..."a" ?
Avatar
Groupe : Membres
virtual
Description : virtual permet de supplanter une fonction membre d'une classe parent depuis une classe dérivée.
Langage : C++
Exemple :

Code : C++
 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
class ClasseA
{
public :
    void Fonction1() { cout << "ClasseA::Fonction1\n"; }
    virtual void Fonction2() { cout << "ClasseA::Fonction2\n"; }
}

class ClasseB : public ClasseA
{
public :
    void Fonction1() { cout << "ClasseB::Fonction1\n"; }
    virtual void Fonction2() { cout << "ClasseB::Fonction2\n"; }
}

int main()
{
    ClasseA a;
    a.Fonction1() // Affichera "ClasseA::Fonction1"
    a.Fonction2() // Affichera "ClasseA::Fonction2"

    ClasseB b;
    b.Fonction1() // Affichera "ClasseB::Fonction1"
    b.Fonction2() // Affichera "ClasseB::Fonction2" 

    // Copie polymorphique
    ClasseA *pa = &b;
    pa->Fonction1() // Affichera "ClasseA::Fonction1"
    pa->Fonction2() // Affichera "ClasseB::Fonction2" (grâce à virtual)

    // Note : on aurait pu aussi utiliser une copie par référence

    return 0;
}

Image utilisateur
 
Hors ligne Davidbrcz # Posté le 31/05/2008 à 13:42:10
Geek un jour, geek toujours !
Avatar
Groupe : Membres
nono212 >> Dans ce contexte. Faut aussi ajouter l'héritage virtuel.

Ce qui me gène avec une liste de mot clé du C++, c'est un mot clé a rarement un sens unique et celui ci varie subtilement en fonction de l'utilisation qu'on en fait.

Par exemple, virtual, static, ...
Édité le 31/05/2008 à 19:54:46 par Davidbrcz

Partager grâce à l'open source et aux logiciels libres.

Mes articles sur developpez.com : http://come-david.developpez.com/

Da Nyug
 
Hors ligne Nanoc # Posté le 31/05/2008 à 19:30:46
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Au début de la rédaction j'aurais dit le contraire. Mais plus je vais en avant plus je rejoins cette idée. C'est très difficile de définir les mots-clés.
 
Hors ligne lmghs # Posté le 31/05/2008 à 22:54:52
Groupe : Membres
Ah! Hein?
Et plus vous comprendrez le C++, plus vous verrez que à quel point ce langage ne peut être résumé à sa syntaxe.
Édité le 31/05/2008 à 22:56:14 par lmghs
 
Hors ligne k1000 # Posté le 02/06/2008 à 20:51:42
Groupe : Membres
dynamic_cast
Description : Transtypage;L'opérateur dynamic_cast est spécialisé dans le polymorphisme : les downcasts (classe mère vers classe fille) et les crosscasts (classe mère vers une autre classe mère). Il effectue un test du type avant le transtypage, si le transtypage est impossible : on retourne NULL dans le cas de pointeurs, ou on lance une exception avec des référence. Il faut ABSOLUMENT du polymorphisme, donc des méthodes virtuelles.
Langage : C++
Exemple et/ou commentaire :Code : C++
 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
44
45
46
47
48
49
50
class mere1
{
public:
    mere1() {}
    virtual ~mere1() {}

    void methode1() {}
    virtual void methode1_polymorphique() {}
};

class mere2
{
public:
    mere2() {}
    virtual ~mere2() {}

    void methode2() {}
    virtual void methode2_polymorphique() {}
};

class fille: public mere, public mere2
{
    fille() {}
    ~fille() {}
    virtual void methode1_polymorphique() {}
    virtual void methode2_polymorphique() {}
};

int main()
{
    mere1* a = new fille;
    fille* b = dynamic_cast<fille*>(a);
    if(b == NULL) // on n'a pas pu transtyper, dynamic_cast retourne NULL
        return -1;
    b->methode2_polymorphique(); // autorise car fille dérive de mere2
    a->methode2_polymorphique(); // INTERDIT

    // de même :
    mere2* c = dynamic_cast<fille*>(a);
    /* équivaut à :
       fille* tmp = dynamic_cast<fille*>(a);
       c = static_cast<mere2*>(tmp);
    */
    if(c == NULL) // on n'a pas pu transtyper, dynamic_cast retourne NULL
        return -1;
    c->methode2_polymorphique(); // autorisé
    a->methode2_polymorphique(); // INTERDIT

    delete a;
}
Hors ligne marshiell # Posté le 09/06/2008 à 20:24:07
return 0;
Avatar
Groupe : Membres
Peut on utiliser un switch avec autre chose qu'un int, comme un double, un string... ?

Image utilisateur
 
Hors ligne lmghs # Posté le 09/06/2008 à 20:34:53
Groupe : Membres
Hors ligne Hiura # Posté le 19/06/2008 à 12:57:20
Avatar
Groupe : Membres
J'aurais voulu savoir si la réponse de k1000 ( http://www.siteduzero.com/forum-83-175 [...] html#r2566107 ) est assez correcte pour être placée dans le post-it.

Idem pour celle de nono212 ( http://www.siteduzero.com/forum-83-175 [...] html#r2556210 ) , mais là j'ai compris qu'elle était incomplète.

Merci.
 
Hors ligne lmghs # Posté le 19/06/2008 à 13:57:51
Groupe : Membres
A quelques 's' et "méthode" (=> s/méthode/fonction membre/) près leurs propositions me paraissent pas mal (c'est tout con mais j'aime bien le fait qu'ils emploient 'downcast', 'crosscast', 'supplanter').

Ceci dit, pour dynamic_cast, c'est peut être un peu court si on n'a pas percuté les différences entre types réel et type officiel (/ "dynamique" et "statique" ? J'ai oublié les termes qui sont usuellement employés). Plus le fait qu'il y a des contraintes de présence de vtable. (FAQ developpez ? ... Arf! Je viens de relire ce que l'on avait écrit et ... des fois un lien c'est bien.)

Pour bien faire, pour virtual, il faudrait faire tout un cours sur le LSP... (sans parler des histoires d'héritage virtuel)

... car comme déjà dit plein de fois, le C++ ne peut pas être réduit à une succession de mots clés. Typiquement, le downcasting doit être la solution de dernier recours. Il est très utile, mais rarement où un débutant croit qu'il est utile.
 
Hors ligne Hiura # Posté le 19/06/2008 à 14:39:11
Avatar
Groupe : Membres
Merci.

Je tente de corriger le dynamic_cast :

Citation : -
dynamic_cast
Description : Transtypage ; L'opérateur dynamic_cast est spécialisé dans le polymorphisme : les downcasts (classe mère vers classe fille) et les crosscasts (classe mère vers une autre classe mère). Il effectue un test du type avant le transtypage, si le transtypage est impossible : on retourne 0 ( NULL ) dans le cas de pointeurs, ou on lance une exception avec des références. Il faut ABSOLUMENT du polymorphisme, donc des fonctions membres virtuelles.
Langage : C++
Exemple et/ou commentaire :Code : C++
 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
44
45
46
47
48
49
50
51
52
53
54
55
class mere1
{
public:
    mere1() {}
    virtual ~mere1() {}

    void f1() {}
    virtual void f1_polymorphique() {}
};

class mere2
{
public:
    mere2() {}
    virtual ~mere2() {}

    void f2() {}
    virtual void f2_polymorphique() {}
};

class fille: public mere, public mere2
{
    fille() {}
    ~fille() {}
    virtual void f1_polymorphique() {}
    virtual void f2_polymorphique() {}
};

int main(int, char**)
{
    mere1* a = new fille;

    fille* b = dynamic_cast<fille*>(a);
    if(b == NULL) // on n'a pas pu transtyper, dynamic_cast retourne NULL.
        return EXIT_FAILURE;

    b->f2_polymorphique(); // autorise car fille dérive de mere2.
    a->f2_polymorphique(); /* INTERDIT. */

    // De même :
    mere2* c = dynamic_cast<fille*>(a);
    /* 
        Équivaut à :
        fille* tmp = dynamic_cast<fille*>(a);
        c = static_cast<mere2*>(tmp);
    */

    if(c == NULL) // On n'a pas pu transtyper, dynamic_cast retourne NULL.
        return EXIT_FAILURE;

    c->f2_polymorphique(); // autorisé.
    a->f2_polymorphique(); /* INTERDIT */

    delete a;
}

Lien : [FAC C++ developpez.com]


Pour ce qui est de virtual, je viens de voir que developpez.com propose qqch : http://cpp.developpez.com/faq/cpp/inde [...] ITION_virtual
Est-ce suffisant pour proposer simplement une redirection ?
 
Hors ligne MatteX # Posté le 19/06/2008 à 16:37:49
The cake is a lie!
Avatar
Groupe : Membres
virtual >> La description est extrêmement courte, manque d'infos sur la v-table qui peut augmenter la taille et le temps de calcul d'une application (Minime mais c'est à prendre en compte sinon on écrirais virtual partout !). Manque d'infos sur l'héritage virtuel (pour l'héritage en diamant). Différences entre méthodes virtuelles et méthodes virtuelles pures, qu'est-ce que ça modifie dans le comportement de la classe ?

dynamic_cast >> Les méthodes sont virtuelles, pas polymorphiques. Peut-on parler de polymorphisme si on a qu'une classe fille ? Comme tout transtypage, dynamic_cast n'est pas une solution à un mauvais design d'application. L'exception lancée est de type std::bad_cast.

liens utiles: FAQ C++ (developpez.com) | GotAPI.com | H-Deb
Mon futur ex-blog | Logique : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Propriétaire d'un Dell Inspiron 1720, Core 2 Duo 2.4Ghz, 3Go DDR2, 8600M GT 256Mo. Avec Blu-Ray!
 
Hors ligne Hiura # Posté le 19/06/2008 à 16:51:41
Avatar
Groupe : Membres
Merci.

Je re-tente de corriger le dynamic_cast :

Citation : -
dynamic_cast
Description : Transtypage ; L'opérateur dynamic_cast est spécialisé dans le polymorphisme : les downcasts (classe mère vers classe fille) et les crosscasts (classe mère vers une autre classe mère). Il effectue un test du type avant le transtypage, si le transtypage est impossible : on retourne 0 ( NULL ) dans le cas de pointeurs, ou on lance une exception ( std::bad_cast ) avec des références. Il faut ABSOLUMENT du polymorphisme, donc des fonctions membres virtuelles.
Langage : C++
Exemple et/ou commentaire :Code : C++
 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class mere1
{
public:
    mere1() {}
    virtual ~mere1() {}

    void f1() {}
    virtual void f1_virtuelle() {}
};

class mere2
{
public:
    mere2() {}
    virtual ~mere2() {}

    void f2() {}
    virtual void f2_virtuelle() {}
};

class fille: public mere, public mere2
{
    fille() {}
    ~fille() {}
    virtual void f1_virtuelle() {}
    virtual void f2_virtuelle() {}
};

int main(int, char**)
{
    mere1* a = new fille;

    fille* b = dynamic_cast<fille*>(a);
    if(b == NULL) // on n'a pas pu transtyper, dynamic_cast retourne NULL.
        return EXIT_FAILURE;

    b->f2_virtuelle(); // autorise car fille dérive de mere2.
    a->f2_virtuelle(); /* INTERDIT. */

    // De même :
    mere2* c = dynamic_cast<fille*>(a);
    /* 
        Équivaut à :
        fille* tmp = dynamic_cast<fille*>(a);
        c = static_cast<mere2*>(tmp);
    */

    if(c == NULL) // On n'a pas pu transtyper, dynamic_cast retourne NULL.
        return EXIT_FAILURE;

    c->f2_virtuelle(); // autorisé.
    a->f2_virtuelle(); /* INTERDIT */

    delete a;

    return EXIT_SUCCES;
}

Note :
  • Comme tout transtypage, dynamic_cast n'est pas une solution à un mauvais design d'application.

Lien : [FAC C++ developpez.com]

 
Hors ligne lmghs # Posté le 19/06/2008 à 19:02:33
Groupe : Membres
Citation : MatteX
dynamic_cast >> Peut-on parler de polymorphisme si on a qu'une classe fille ?

a- D'abord je pinaille beaucoup.
Le polymorphisme réunit 4 choses selon la taxinomie de Lucas (?) Cardelli (wikipedia est normalement votre ami). Rapidement: La surcharge, et les convertions implicites parmi les polymorphismes ad'hoc. Le polymorphisme paramétrique (i.e. généricité par template en C++ ; NB le plus vieux de tous) et le polymorphisme d'inclusion (ou d'héritage selon les gens) parmi les polymorphismes universels.

Il y a eu une sorte de glissement sémantique depuis l'hégémonie des langages bridés OO. Maintenant les gens disent juste "polymorphisme" pour en fait désigner uniquement le polymorphisme d'inclusion.


b- Et maintenant je réponds à cette petite question qui appelle à pinailler.
Ma vision du polymorphisme d'inclusion, c'est avant tout la substituabilité (au sens du Principe de Substitution de Liskov). C'est à dire: on peut utiliser un objet d'un type qui dérive d'un type là où un objet du type parent est attendu. "virtual" introduit la possibilité liaison tardive: c'est à l'exécution que l'on détermine la vrai fonction à appeler. Mais ... on peut très bien juste rajouter des fonctions à un type sans altérer le comportement de ses autres fonctions. Et utiliser un objet de ce type enrichi là où l'on attendait un objet parent .. sans qu'aucun des deux ne dispose d'une fonction virtuelle.
Nous sommes toujours dans une situation où nous pouvons parler de polymorphisme (d'inclusion).

(Il y a encore moyen d'en parler pendant des pages et des pages)


PS-EDIT: "do" seul n'est pas un mot clé valide.
Édité le 19/06/2008 à 19:07:02 par lmghs
 
Hors ligne nono212 # Posté le 19/06/2008 à 21:12:13
Euh..."a" ?
Avatar
Groupe : Membres
Virtual ça englobe pleins de trucs, il faudrait un cours dessus (j'exagère ? :p ).
Et puis, virtual a plusieurs significations selon où il est placé...

Il faudrait un cours sur le polymorphisme en fait ^^

Image utilisateur
 
Hors ligne Hiura # Posté le 20/06/2008 à 09:57:41
Avatar
Groupe : Membres
Je vous remercie beaucoup de votre attention. Mais là, je suis (plus ou moins complètement) largué. :-°
(Faut avouer que mon bagage en C++ est vraiment petit, voir microscopique par rapport à toi, lmghs, et bien d'autres.)

Je t'enterrais de m'instruire prochainement, quand j'aurais plus de temps.

Pour le "do" j'ai déjà demandé à ce qu'il soit supprimé. ;)

 
Hors ligne lmghs # Posté le 20/06/2008 à 10:15:00
Groupe : Membres
(En fait, il y a très peu de particularités du C++ dans ce que j'ai dit ^^)
 
Hors ligne Hiura # Posté le 20/06/2008 à 12:00:39
Avatar
Groupe : Membres
nan, mais c'est la "culture ++" ;) .
 
Hors ligne Davidbrcz # Posté le 20/06/2008 à 13:03:51
Geek un jour, geek toujours !
Avatar
Groupe : Membres
Cpa vraiment culture. C'est plus les théories/axiomes qui se cachent derrière la POO.
Un bon lien la dessus : http://www.crossbowlabs.com/dossiers/principes-avances-oo
Édité le 20/06/2008 à 13:04:38 par Davidbrcz

Partager grâce à l'open source et aux logiciels libres.

Mes articles sur developpez.com : http://come-david.developpez.com/

Da Nyug
 
Hors ligne lmghs # Posté le 20/06/2008 à 13:48:32
Groupe : Membres
Il existe des ressources en français qui connaissent Object Mentor ?... C'est énorme!
 
Hors ligne Davidbrcz # Posté le 20/06/2008 à 14:07:43
Geek un jour, geek toujours !
Avatar
Groupe : Membres
Euh Object Mentor c'est très bien mais c'est pas en francais.

Partager grâce à l'open source et aux logiciels libres.

Mes articles sur developpez.com : http://come-david.developpez.com/

Da Nyug
 
Hors ligne gparent # Posté le 12/08/2008 à 17:15:58
Groupe : Membres
Un commentaire: Les définitions des mots clés pour les types primitif sont pour la plupart pas correctes. Je ne peux pas fournir de corrections exactes puisque je n'ai pas le document ISO C++ avec moi, mais par example, il est incorrect de dire qu'un char peut contenir une valeur entre -128 et 127. Selon la standard, un char peut être signed ou unsigned. Donc de 0 à 255 ou de -128 à 127. Un autre exemple: le type "double", si je me rapelle bien, n'a aucun minimum ou maximum défini. La seule chose qui est certain, c'est qu'un double à au moins autant de précision qu'un float, et un double double à au moins autant de précision qu'un double.

De plus, la description de int est aussi incorrecte- Un int est différent sur les architectures 64-bit, par exemple. Je crois que le standard définit int comme ayant le nombre de bits de l'architecture (ex. int sur Windows XP a 32-bit d'espace, sur Windows XP 64-bit, il en a 64-bit).

Je vais essayer de me rapeller de poster les corrections nécéssaires, mais n'importe qui qui a le document du standard C++ pourrait faire ces mêmes corrections.
Édité le 12/08/2008 à 17:18:44 par gparent
Hors ligne lmghs # Posté le 12/08/2008 à 17:57:37
Groupe : Membres
L'erreur a déjà été signalée dans les première pages...
Les seules certitudes, c'est les inégalités entre tous les types, et le fait qu'un int ait au moins 16bits.
 
Hors ligne Hiura # Posté le 12/08/2008 à 18:11:56
Avatar
Groupe : Membres
Oui, ce que vous dites est juste. Mais les valeurs exposées sont celles du tableau du tuto ( http://www.siteduzero.com/tuto-3-1224- [...] tml#ss_part_2 , un peu plus bas ). Après, soit on dit la même chose que dans le tuto, même si c'est pas tout à fait la réalité, soit on sort les valeurs de la norme, qui ne sont pas (si je me trompe pas) des valeurs numériques mais des tailles relatives. Mélanger les deux n'aurait pas vraiment de sens (ou bien?).

Je suis un peu mitigé : on est sur le sdz, donc il serait logique d'avoir une correspondance entre le cours proposé et ce topic, mais en même temps c'est de C++ qu'on parle. Quel est votre point de vue?
 
Hors ligne lmghs # Posté le 12/08/2008 à 18:17:43
Groupe : Membres
Ce n'est pas parce qu'il y a une erreur dans le tuto qu'il faut continuer avec.

AMA, La bonne approche consiste à réunir tous les types ensemble, sortir les inégalités officielles, et dire : "voilà pour telle architecture les valeurs typiques sont:", "Vous pourrez toujours les obtenir via ces constantes ... (cf <limits.h> et <limits>)", "si vous voulez *toujours* plus précis, cf <stdint.h> (C99 et C++0x) (IIRC)"
 
Hors ligne Freedom # Posté le 12/08/2008 à 18:24:01
I can ... but I won'r
Avatar
Groupe : Membres
Le C++ est un langage normalisé, si tu donnes une information sur le langage mieux vaux qu'elle soit conforme à la norme, Mateo donne dans le cour des valeurs car ce sont celles que l'on retrouve le plus souvent sur les architectures et implementations actuel de la norme (même si je me demande si l'avenement du 64 bits, ne va pas finir par faire quelques changement). Le mieux serait de donner les 2 informations, tu donnes la norme, puis tu précise que la plus part du temps ces valeurs sont : ..., et tu peut aussi indiquer où les vérifier (std::numric_limits<type>)

Edit : grillé par lmghs :p
Édité le 12/08/2008 à 18:24:57 par Freedom
 
Hors ligne lmghs # Posté le 12/08/2008 à 18:33:59
Groupe : Membres
Au taf, sur une "vieille" Solaris, j'ai "2*sizeof(int) == sizeof(long) == sizeof(long long) == 8". Ce qui ne correspond pas au tableau du tuto.
 
Hors ligne Hiura # Posté le 12/08/2008 à 18:45:47
Avatar
Groupe : Membres
D'accord, alors je verrais pour corriger ça prochainement (faut que je contacte l'auteur des post et toussa). Merci de votre intérêt. :)
[Je prendrais sûrement un passage du "langage c++".]
PS : si vous avez un lien vers la norme ce serait pas mal comme complément d'information.
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 213 Zéros connectés | Requêtes SQL 6 requêtes | Temps de génération de la page : Total (SQL) 0.0295s (0.011s)