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

MFC Discussion :

Problème : destruction d'un objet en fonction de son type


Sujet :

MFC

  1. #1
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut Problème : destruction d'un objet en fonction de son type
    Salut,

    Je dispose d'une classe ayant pour membre ces jolies petites bêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CEdit*  pEdit;
    CComboBox* pCombo;
    CObArray* array_EditBoxes;
    array_EditBoxes va à la fois contenir des CComboBox et des CEdit.

    Se pose alors un problème concernant le destructeur, il faut vérifier le type de l'élement contenu dans array_EditBoxes avant de le déléter, ou est-ce que je me trompe ?

    Voila ce que j'ai pour l'instant :
    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
    CDynamicForm::~CDynamicForm()
    {
     for (int i=0; i <array_EditBoxes->GetSize() ; i++ )
     {
       if (array_EditBoxes->GetAt(i)->IsKindOf(RUNTIME_CLASS(CEdit)))
       {
         pEdit = (CEdit *)array_EditBoxes->GetAt(i);
         delete pEdit;
        }
     
       if (array_EditBoxes->GetAt(i)->IsKindOf(RUNTIME_CLASS(CComboBox)))
       {
        pCombo = (CComboBox *)array_EditBoxes->GetAt(i);
        delete pCombo;
       }	
     }
     array_EditBoxes->RemoveAll();
     delete array_EditBoxes;
    }
    Et résultat des course lors de la fermeture de mon application j'ai le droit à un beau bug mémoire...

    "array_EditBoxes->GetAt(i)->" étant un CObject faut-il transtyper absolument vers un CEdit ou un CComboBox ? (j'ai essayé mais j'ai toujours mon bug mémoire...)

    Que faire ???

    Merci d'avance
    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    il ne faut plus utiliser ces classes voir faq:
    http://c.developpez.com/faq/vc/?page...HowToSerialize
    il vaut mieux utiliser un CArray ou un vector des stl .

    pour la destruction il suffira d'avoir un tableau sur CWnd * qui est la classe de base pour tous les controles ,donc pas de probleme pour la destruction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CArray<CWnd *,CWnd *>  m_array_EditBoxes;
    attention il faut include dans stdafx.h : #include <afxtempl.h>
    apres pour les fonctions c'est toujours Add ou GetAt c'est pareil .

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Le code que tu as n'est pas correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       if (array_EditBoxes->GetAt(i)->IsKindOf(RUNTIME_CLASS(CEdit))) 
       { 
         pEdit = (CEdit *)array_EditBoxes->GetAt(i); 
         delete pEdit; 
        } 
     
       if (array_EditBoxes->GetAt(i)->IsKindOf(RUNTIME_CLASS(CComboBox))) 
       { 
        pCombo = (CComboBox *)array_EditBoxes->GetAt(i); 
        delete pCombo; 
       }
    Tu n'as pas besoin de savoir le type pour détruire un objet !!!
    Parcourt juste ton array et détruit les éléments, le reste serait fait automatiquement !

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Contrairement aux réponses précédentes je préférrais faire deux listes CArray ou CObArray différentes plutôt qu'une seule qui englobe à la fois CEdit et CButton.
    Parce que CEdit ou CButton ne se comportent pas pareil et d'une manière ou d'une autre il faudra faire le distinguo..........

    l vaut mieux utiliser un CArray ou un vector des stl .
    Avec la STL ( std::vector ou autres) le problème se posera également.
    D'ailleurs c"était une solution que j'avais proposée à Loupdeau.

    Mais la STL avec MFC pas terrible mieux vaut être homogène sur toute la ligne et utiliser MFC avec MFC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef CArray<CItem,CItem&> CArrayItem;
    Ceci c'est une manière plus élégante que d'utiliser CObArray et ça évite les "casts" ( confére "Programming the MFC 2nd Edition '" par Jeff Prosise )
    Mais ça n'évite pas la même problèmatique

    Bon maintenant vous être libres de faire ce que vous voulez.........

  5. #5
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Merci Farscape,

    Migration vers CArray effectuée avec succès.
    Concernant mon destructeur je ne sais pas si j'ai fait la juste utilisation du "tableau sur CWnd *", mais j'ai bidouillé un truc qui apparament marche, vu que je ne me fais plus "insulter" quand je quitte mon application.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CDynamicForm::~CDynamicForm()
    {
     int taille = array_EditBoxes->GetSize();
     CWnd** table_CWnd = new CWnd*[taille]; 
     for (int i=0; i < array_EditBoxes->GetSize() ; i++ )
     {
      table_CWnd[i]=array_EditBoxes->GetAt(i);	 
     }
     delete [] table_CWnd;
     array_EditBoxes->RemoveAll();
     delete array_EditBoxes;
    }

    Merci Ti-R, je suis aussi également arrivé à un truc qui apparament fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CDynamicForm::~CDynamicForm()
    {
      for (int i=0; i < array_EditBoxes->GetSize() ; i++ )
       {
         CObject* pObject;
         pObject = array_EditBoxes->GetAt(i);
         delete pObject;
       }
     array_EditBoxes->RemoveAll();
     delete array_EditBoxes;
    }
    Et maintenant je choisi qu'elle solution lol ?
    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

  6. #6
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Code: 
    CDynamicForm::~CDynamicForm() 
    { 
     int taille = array_EditBoxes->GetSize(); 
     CWnd** table_CWnd = new CWnd*[taille]; 
     for (int i=0; i < array_EditBoxes->GetSize() ; i++ ) 
     { 
      table_CWnd[i]=array_EditBoxes->GetAt(i);    
     } 
     delete [] table_CWnd; 
     array_EditBoxes->RemoveAll(); 
     delete array_EditBoxes; 
    }

    Ce n’est pas bon...
    Tu détruits bien le tableau de pointeur mais pas les objets pointés


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CDynamicForm::~CDynamicForm() 
    { 
      for (int i=0; i < array_EditBoxes->GetSize() ; i++ ) 
       { 
         CObject* pObject=array_EditBoxes->GetAt(i); 
         if(pObject)
           delete pObject;
       } 
     array_EditBoxes->RemoveAll(); 
     delete array_EditBoxes; 
    }

  7. #7
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    mat.M,

    Je suis toujours dans la création de mon "formulaire dynamique".
    Les champs que l'utilisateur devra remplir seront soit des CEdit soit des CComboBox, c'est pour ca que j'ai tout mis dans un seul CArray, afin que l'accès a chaque champ se fasse par son numéro.

    Maintenant comme tu l'as si bien fait remarquer, il va falloir distinguer les CEdit et CComboBox à un moment, et y a de grandes chances que je sois embêté à ce moment là...


    A mediter


    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par loupdeau
    mat.M,

    Je suis toujours dans la création de mon "formulaire dynamique".
    Les champs que l'utilisateur devra remplir seront soit des CEdit soit des CComboBox, c'est pour ca que j'ai tout mis dans un seul CArray, afin que l'accès a chaque champ se fasse par son numéro.

    Maintenant comme tu l'as si bien fait remarquer, il va falloir distinguer les CEdit et CComboBox à un moment, et y a de grandes chances que je sois embêté à ce moment là...


    A mediter


    pas du tout ,avec isKindOf tu seras quel type d'objet est dans ton tableau il suffira de le caster vers le type souhaité et reconnu ....

  9. #9
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Merci Ti-R


    Farscape, visiblement j'ai pas compris ce à quoi tu pensais... Ca m'interesserait de voir ta méthode si tu veux bien.
    Merci
    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

  10. #10
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    En effet avec IsKindOf aucun problème...

    Tout est bien qui commence bien

    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    re ,
    Maintenant comme tu l'as si bien fait remarquer, il va falloir distinguer les CEdit et CComboBox à un moment, et y a de grandes chances que je sois embêté à ce moment là...
    reponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	CArray<CWnd *,CWnd *>  m_array_EditBoxes;
    //........ insertion des elements.
     
    	// detection de l'element et appel d'une methode en consequence.
    	// note pour les fonctions communes a la classe de base CWnd pas de probleme un appel direct suffit.
    	if(m_array_EditBoxes[0]->IsKindOf(RUNTIME_CLASS(CEdit)))
    			static_cast<CEdit *>(m_array_EditBoxes[0])->Cut();

  12. #12
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Voila je pense que tout est accompli, en tout cas concernant ce post...



    PS:
    static_cast<CEdit *>(m_array_EditBoxes[0])->Cut();
    Le jour où je ponderai des subtilités de ce genre tout seul, je serai heureux...
    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    comme quoi le bonheur c'est simple comme un cast

  14. #14
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Salut,

    Pour compléter les postes précédents, à titre d'information, il y a la notion de destructeur virtuel qui garantise la destruction des objets en fonction de leurs types...

  15. #15
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Certe,

    Mais est-ce que tu es sûr que la notion de destructeur virtuel est applicable dans ce cas ?
    D'après ce que je crois savoir, il peut-être utile d'utiliser un destructeur virtuel dans la classe de base lorsqu'on fait du polymorphisme, ce qui n'est pas le cas ici...

    :
    Il y a seulement 10 sortes de personnes dans le monde. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/09/2008, 15h42
  2. Réponses: 10
    Dernier message: 18/05/2006, 16h18
  3. [hibernate]Problème de récupération d'objet...
    Par roxx62 dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2005, 11h36
  4. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27
  5. Réponses: 4
    Dernier message: 15/09/2004, 16h52

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