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

Langage C++ Discussion :

Fabrique et RAII


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Août 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 42
    Par défaut Fabrique et RAII
    Bonsoir

    Après avoir lu : https://www.developpez.net/forums/d1...tion-pointeur/

    Je suis en train de porter du code C# en C++.
    Mon souci est de convertir ce qui ressemble fortement à un pattern Fabrique et d'y appliquer au mieux le RAII, qui n'est évidemment pas utilisé en C#.

    Dans le code original, j'ai une méthode qui me renvoie un objet (en fait une référence implicite) d'une classe abstraite. L'objet réel étant une instance d'une classe concrète construit dans la Fabrique et qui sera nettoyé par le GC.
    En C++, pas possible de renvoyer une référence sur un objet qui serait détruit dès la sortie de portée de la méthode Fabrique. Je renvoie donc un pointeur et l'objet appelant a la charge de le détruire. C'est pas du tout RAII et exception-safe.

    Si j'ai bien compris, en C++11, unique_ptr permet d'encapsuler construction et destruction automatique. Mais cette classe a bien une sémantique d'entité. Comment la mettre en résultat de fonction qui, par définition, fait une copie?
    Et comment se débrouiller en C++98/03 ?
    L'idéal est donc au moins de séparer ce qui construit de tes ressources de ce qui les maintient en mémoire
    Je ne suis pas sûr de comprendre, on cherche bien à ce que l'objet qui alloue la mémoire soit responsable de la restituer automatiquement dans son destructeur.

    Une Fabrique RAII exige-t-elle donc de pouvoir utiliser la sémantique de déplacement et donc le C++11 a minima ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Grool Voir le message
    Comment la mettre en résultat de fonction qui, par définition, fait une copie?
    C'est pour ça que C++11 vient avec la sémantique de déplacement. Et return en tirera profit.
    Citation Envoyé par Grool Voir le message
    Et comment se débrouiller en C++98/03 ?
    Tu peux très bien créer ton propre scoped_ptr ou nom de ton choix qui mimique unique_ptr. La majorité des codebases que j'ai vu datant d'avant C++11 ont un tel objet.

    Citation Envoyé par Grool Voir le message
    Une Fabrique RAII exige-t-elle donc de pouvoir utiliser la sémantique de déplacement et donc le C++11 a minima ?
    Y'a aucune exigence mais avec C++11 c'est instantanné et marche directement. Avec les versions précédentes il faut bricoler toi-même.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    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
    Tu peux faire du RAII avant C++11, mais il y a certains points où tu seras limité (ou alors où le code sera facile à mal écrire).

    Au moment où tu crées l'objet, et éventuellement le configure, il est logique que ce soit ta Fabrique qui possède l'objet.
    Une fois cette construction finie, il devient logique que ce soit l'utilisateur qui le possède.

    Il n'y a donc pas trop le choix: Soit la propriété est transférée de l'un à l'autre (c'est ce que fait la sémantique de mouvement sur un unique_ptr), soit la propriété est partagée entre les deux (c'est ce que ferait un shared_ptr, avec tous les problèmes liés à une copropriété).

    Maintenant, on est en 2018, C++11 devrait être un acquis un peu partout, non ?
    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.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Août 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 42
    Par défaut
    Merci pour ces réponses.

    Maintenant, on est en 2018, C++11 devrait être un acquis un peu partout, non ?
    Certes... Je m'attendais bien à cette remarque. Mais je dispose d'un Visual C++ 2010 Pro dont le support de C++11 est incomplet (et y a peu de chance qu'on m'achète une licence plus récente).

    Cela dit, j'envisage sérieusement d'essayer quelque chose de plus moderne à titre personnel. Eclipse CDT notamment.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Toutes les versions récentes de VS ont une version Community, totalement gratuite et qui est exactement identique à la version pro. (la seule différence doit être l'interdiction de commercialiser des programmes faits sous Community je pense, comme les Express auparavant).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Et j'utilise depuis quelques jours la version 2017 et je suis bien surpris des progrès par rapport à la version 2013 ou 2015 que j'utilisais il y un an dans ma précédente mission

  7. #7
    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
    Citation Envoyé par Bousk Voir le message
    Toutes les versions récentes de VS ont une version Community, totalement gratuite et qui est exactement identique à la version pro. (la seule différence doit être l'interdiction de commercialiser des programmes faits sous Community je pense, comme les Express auparavant).
    C'est même autorisé de commercialisé des produits faits avec la version community, sous certaines conditions (en gros, particuliers, très petites entreprises) :
    https://visualstudio.microsoft.com/f...rms/mlt553321/

    Après, il faut payer. Mais franchement, je pense que le gain en productivité vaut souvent la chandelle (pas forcément le gain entre une community et une version plus luxueuse, ça dépend des usages, mais bien le gain entre une version 2010 et une version 2018).
    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.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par JolyLoic Voir le message
    Après, il faut payer. Mais franchement, je pense que le gain en productivité vaut souvent la chandelle (pas forcément le gain entre une community et une version plus luxueuse, ça dépend des usages, mais bien le gain entre une version 2010 et une version 2018).
    +150 000!!!
    Quand je vois que C++11 n'a pas été correctement respecté jusqu'aux versions 2017 (si pas même 2018), entre autres, pour les fonctions =delete et=default, je ne peux qu'être pleinement d'accord avec toi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Fabriquer des requêtes sql à partir d'un document xml
    Par ktel dans le forum XQUERY/SGBD
    Réponses: 4
    Dernier message: 18/10/2005, 16h45
  2. RAII et virtual
    Par buzzz dans le forum C++
    Réponses: 3
    Dernier message: 22/02/2005, 14h51
  3. [GOF] Fabrique abstraite peut-elle être un Singleton ?
    Par manel007 dans le forum Design Patterns
    Réponses: 7
    Dernier message: 06/01/2005, 10h02
  4. [GOF] [Fabrique Abstraite] [Pont] Questions ?
    Par manel007 dans le forum Design Patterns
    Réponses: 5
    Dernier message: 04/01/2005, 20h18
  5. fabriquer un .X
    Par Fikus dans le forum DirectX
    Réponses: 4
    Dernier message: 23/03/2004, 15h24

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