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 :

Question de conception


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Points : 13
    Points
    13
    Par défaut Question de conception
    Bonjour j'ai (encore) une question de C++, mais là c'est plus de la conception.

    Pour simplifier, j'ai pour mon programme une classe A qui est représentée par une image, qui varie selon les argument passés au constructeur. Je cherche à ne pas "stocker" l'image dans mon objet afin que si plusieurs objets A utilisent la même image, il n'y ait qu'une seule image en mémoire dans le programme.

    Comment faire? J'ai plusieurs idées mais je suis pas sûr de comprendre ce qui va se passer concrètement si je les essaie :

    - A priori l'idéal ça serait que j'envoie le nom de fichier de l'image dans le constructeur de A, et qu'il stocke le fichier en mémoire si il n'y est pas, et puis ensuite que de toute façon il pointe dessus par attribut. Le prob : comment je vais pouvoir gérer tout ça vu que je serai dans mon constructeur ?

    - Une autre possibilité ça serait que je créé mes images par avance, et que je les envoie par référence au constructeur de A, qui lui stocke juste un pointeur... mais ça va vite être lourd à écrire et c'est pas vraiment possible à automatiser, enfin c'est pas top de devoir créer plein d'objets annexes que je vais plus ou moins paumer après et jamais m'en servir directement

    - D'autre part quand je vais effacer mes éléments de la classe A, il faudrait aussi que je puisse libérer la mémoire que prend les images associées...

    Bref je vois pas trop comment faire ça "proprement"... une idée?

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    pourquoi ne pas utiliser une classe dédiée qui stockerai les images dans un tableau, ou une table de hachage, et qui contrôlerai l'unicité de ces images.

    Ensuite chaque classe A qui a besoin d'une image irai la demander à cette classe dédiée.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Citation Envoyé par lezebulon Voir le message
    - A priori l'idéal ça serait que j'envoie le nom de fichier de l'image dans le constructeur de A, et qu'il stocke le fichier en mémoire si il n'y est pas, et puis ensuite que de toute façon il pointe dessus par attribut. Le prob : comment je vais pouvoir gérer tout ça vu que je serai dans mon constructeur ?
    Pour cette approche, une solution possible consiste à doter ta classe A d'un conteneur global (avec le mot-clé static).
    Comme cela, ton conteneur sera partagé par toutes tes instances.

    Citation Envoyé par lezebulon Voir le message
    - Une autre possibilité ça serait que je créé mes images par avance, et que je les envoie par référence au constructeur de A, qui lui stocke juste un pointeur... mais ça va vite être lourd à écrire et c'est pas vraiment possible à automatiser, enfin c'est pas top de devoir créer plein d'objets annexes que je vais plus ou moins paumer après et jamais m'en servir directement
    Effectivement, ça me paraît moins efficace que ta précédente solution.

    Citation Envoyé par lezebulon Voir le message
    - D'autre part quand je vais effacer mes éléments de la classe A, il faudrait aussi que je puisse libérer la mémoire que prend les images associées...
    Tu auras juste à ôter de ton conteneur l'image donnée par ton instance.
    Attention, cela libérera la mémoire pour toutes les instances en même temps.

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    LA solution : un shared_ptr.
    Comme ça tu n'as qu'une seule instance, c'est partagé de manière safe, et tu n'as pas de questions à te poser, ça se libère tout seul !

  5. #5
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Citation Envoyé par poukill Voir le message
    LA solution : un shared_ptr.
    Pour information, ça se trouve dans boost ces petites bêtes là.

    Et un petit exemple d'utilisation dans la faq pour pouvoir démarrer.

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    C'est aussi dans le nouveau standard : std::tr1::shared_ptr

  7. #7
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Ah d'accord, je n'étais pas au courant.
    C'est celui de boost ou tout a été refait?

  8. #8
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Et surment dans std:: directement slon ton compilo et les options de compilation (header memory).

    Les pointeurs intelligents sont un concept, la norme présice l'interface et les différents comportements, la facon dont ils doivent être implémentés n'est pas normalisé (comme pour tout le standard). Regardes le dernier draft si tu veus connaitre l'interface (très semblable si ce n'est identique à celle de boost/loki et autre).

  9. #9
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Ah d'accord, je n'étais pas au courant.
    C'est celui de boost ou tout a été refait?
    C'est implémentation dépendant, comme tout les composants de la STL. Mais par exemple la STL de gcc utilise celui de boost en effet oui .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Il n'y a pas d'implémentation standard du standard?!

    Et il y a des grosses différences connues entre les diverses implémentations?

    EDIT : tiens d'ailleurs je pense à un truc.
    Quand je suis passé de gcc à visual, mon bout de code manipulant NAN et INFINITY avec std::numerical_limits ne compilait plus sous visual.
    Je me demande si ça ne vient pas de ça.

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Il n'y a pas d'implémentation standard du standard?!
    Bien sur que non, le standard spécifie des interfaces et des conditions (complexité etc).

    Et il y a des grosses différences connues entre les diverses implémentations?
    Au niveau de la vitesse? non pas trop en général.
    Au niveau du respect : un peu plus oui.

    EDIT : tiens d'ailleurs je pense à un truc.
    Quand je suis passé de gcc à visual, mon bout de code manipulant NAN et INFINITY avec std::numerical_limits ne compilait plus sous visual.
    Je me demande si ça ne vient pas de ça.
    NaN n'existe pas en C++
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Citation Envoyé par Goten Voir le message
    Au niveau du respect : un peu plus oui.
    Tu as des exemples en tête.


    Citation Envoyé par Goten Voir le message
    NaN n'existe pas en C++
    Oui, ça je l'ai appris à mes dépends... ^^
    Mais avec la distribution MinGW (installation auto avec g++ 3.4 je crois), je peux t'assurer que NAN est défini.

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Points : 13
    Points
    13
    Par défaut
    Vous pouvez m'expliquer le truc avec un shared_ptr??
    Je vais quand même être obligé de créer une classe spéciale qui s'occupe de la création des images non?
    Enfin admettons que je créé mon shared_ptr , il créé donc mes objets en mémoire (où ?) mais je suis toujours obligé de garder en mémoire un référence sur cet objet, si je veux ré-intanscier mon objet A avec des images déjà utilisées

  14. #14
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    Pour confirmer et faire simple, le mieux c'est d'utiliser le mot clé "static" pour le conteneur de ton image. Ainsi fait, cette ressource sera partagée par tous les objets et quand le dernier objet sera détruit cette ressource sera forcément détruite !!!

    Beaucoup se complique la vie en voulant faire des trucs tordus alors qu'il existe ce qu'il faut dans le language il faut simplement le connaître précisément !!!
    Le bonheur est sans raison

  15. #15
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    Citation Envoyé par Chessmaster1966 Voir le message
    Beaucoup se complique la vie en voulant faire des trucs tordus alors qu'il existe ce qu'il faut dans le language il faut simplement le connaître précisément !!!
    Moi aussi j'aurais naturellement fait un conteneur statique mais c'est vrai qu'avec shared_ptr il va gagner en temps de développement et en fiabilité, notamment au niveau de la gestion de la mémoire.

  16. #16
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Citation Envoyé par lezebulon Voir le message
    Vous pouvez m'expliquer le truc avec un shared_ptr??
    Je vais quand même être obligé de créer une classe spéciale qui s'occupe de la création des images non?
    Enfin admettons que je créé mon shared_ptr , il créé donc mes objets en mémoire (où ?) mais je suis toujours obligé de garder en mémoire un référence sur cet objet, si je veux ré-intanscier mon objet A avec des images déjà utilisées
    Tiens, regarde ce tutoriel.

    Tu pourras notamment y lire l'intérêt pour toi :

    Le modèle derrière ce pointeur est celui où plusieurs pointeurs permettent l'accès à une même donnée, sans que l'un de ceux-ci soit investi du rôle particulier consistant à être le responsable de la durée de vie de l'objet. Cette responsabilité est partagée (d'où le nom shared) entre tous les pointeurs pointant à un moment donné sur l'objet.


    Comment dans ce cas la mémoire sera-elle libérée ? En fait, quand un pointeur est détruit, il vérifie s'il n'était pas le dernier à pointer sur son objet. Si c'est le cas, il détruit l'objet, puisqu'il est sur le point de devenir inaccessible. Afin de connaître cette information, un compteur de référence est associé à l'objet, à chaque fois qu'un nouveau pointeur pointe sur l'objet, le compteur de référence est incrémenté. A chaque fois que le pointeur arrête de pointer sur cet objet (parce qu'il est détruit, ou s'apprête à pointer sur un autre), le compteur est décrémenté. Si le compteur atteint 0, il est temps de détruire l'objet.

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Chessmaster1966 Voir le message
    Pour confirmer et faire simple, le mieux c'est d'utiliser le mot clé "static" pour le conteneur de ton image. Ainsi fait, cette ressource sera partagée par tous les objets et quand le dernier objet sera détruit cette ressource sera forcément détruite !!!
    Et si deux objets de types A utilisent deux images différentes !

  18. #18
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    Le problème avec "shared_ptr" c'est qu'il n'existe pas dans tous les languages.

    J'utilise Code::Blocks avec gcc 3.4.5 et il n'existe pas !

    Mais je ne vois pas où c'est compliqué que de charger en mémoire une image
    puis de faire de cette zone une zone statique partagée par tous les objets.

    Voici le code avec le mot clé static :


    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
     
    class A
    {
     
        static string TonImage;
     
        public:
            A(string Image)
            {
                if(TonImage == "")
                    TonImage = Image;
     
            }
            string GetImage(){return TonImage;}
    };
     
    string A::TonImage="";
     
    int main()
    {
        A *a1 = new A("Paysage sous-marin");
        cout << "Objet 'a1' : " << a1->GetImage() << '\n';
        A *a2 = new A("Paysage de montagne");
        cout << "Objet 'a2' : " << a2->GetImage() << '\n';
        A *a3 = new A("Paysage de foret");
        cout << "Objet 'a3' : " << a3->GetImage() << '\n';
     
        system("pause");
     
        return 0;
     
    }
    Le bonheur est sans raison

  19. #19
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par gl Voir le message
    Et si deux objets de types A utilisent deux images différentes !
    Ce n'est pas le sujet du problème de : lezebulon
    Le bonheur est sans raison

  20. #20
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Citation Envoyé par Chessmaster1966 Voir le message
    Ce n'est pas le sujet du problème de : lezebulon
    Il y en a un de nous deux qui n'a pas compris la question de départ.
    Il me semble en effet que deux instances peuvent avoir deux images différentes dans le problème.
    La question porte surtout sur la manière dont gérer le fait que deux images peuvent avoir la même image.
    Ta solution de passer par du static est acceptable dans la mesure où cette donnée static contient plusieurs images.

Discussions similaires

  1. [WIN32] question de conception
    Par gdpasmini dans le forum MFC
    Réponses: 4
    Dernier message: 10/07/2006, 11h08
  2. [Data-sources] Questions de conception
    Par xfacq dans le forum Général Java
    Réponses: 1
    Dernier message: 02/06/2006, 01h32
  3. [VB.net] Question sur conception
    Par arno2000 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 14/04/2006, 08h35
  4. [XML]Question de conception
    Par nana1 dans le forum Persistance des données
    Réponses: 17
    Dernier message: 17/11/2005, 09h34
  5. [Strategie][GUI]Petite question de conception
    Par bischof dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 26/10/2004, 22h31

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