begin process at 2010 02 10 10:27:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Disparition de pointeurs sur classes derivees


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Disparition de pointeurs sur classes derivees

dimanche 19 novembre 2006 à 12:28:51 | Disparition de pointeurs sur classes derivees

Natural M

Bonjour a tous !
Alors voilà, j'ai un petit probleme de pointeurs sur classes derivées qui disparaissent des la sortie de leur espace de construction.

-------------- .h

class Mere{
    public :
       virtual int GetId(){ return -1; }
};

class Fille : public Mere {
    public :
       virtual int GetId(){ return 5; }
};

class Interface{
    public :
       void Action();  /** est appelée lors d'un evenement utilisateur */
       Mere* pointeur;
};

------------- .cpp

Interface::Interface(){
    pointeur = new Fille();
    pointeur->GetId() // Fonctionne
};

Interface::Action(){
    pointeur->GetId() // Segmentation Fault
};

En gros, j'ai une classe Mere, et une classe Fille derivée de Mere. Je cree un objet Fille, que je veut pouvoir utiliser durant tout le programme, j'en stocke donc l'adresse. Mais je ne veut pas avoir a connaitre a l'avance l'existence de cet objet Fille, donc je stocke un poinetur de type (Mere*).
Le probleme, c'est que des que je sort de l'espace ou cet objet a été créé, mon pointeur semble ne plus etre valide.
J'ai tenté de stocker ce pointeur avec Boost, avec wxWidget, avec les conteneurs standars, des tableaux et autres. Rien n'y fait. J'ai beau tenter d'approfondir les mecanismes de l'heritage, je n'arrive pas a comprendre pourquoi mon pointeur devient invalide. Mon objet Mere derive lui-meme d'un objet wxWidget, qui lui semble toujours valide alors meme que mon pointeur ne l'est plus.

Si vous pouviez m'indiquer ce que je fait de travers, ou bien un mecanisme important que je n'ai peut etre pas bien compris, ce serais tres sympa^^

Merci d'avance.
dimanche 19 novembre 2006 à 12:57:44 | Re : Disparition de pointeurs sur classes derivees

vecchio56

Administrateur CodeS-SourceS
Est-ce que tu crée bien ton objet sur le tas? Sinon, c'est normal qu'il ne soit plus valide à un moment donné
Il faut donc faire pointeur = new Fille(...), et non Fille f = Fille(); pointeur = &f; (à moins que f ne soit déclaré en global, ou en local dans main)

_____________________________________
Un éditeur de ressources gratuit pour Windows

dimanche 19 novembre 2006 à 13:29:27 | Re : Disparition de pointeurs sur classes derivees

Natural M

Et bien je declare le pointeur dans une classe, ensuite je ne l'utilise que dans cette classe.
Je le definit dans le constructeur de la classe.

class Interface{
    public :
       void Action();  /** est appelée lors d'un evenement utilisateur */
       Mere* pointeur;
};

Interface::Constructeur(){
    pointeur = new Fille();
    pointeur->GetId() // Fonctionne
};

// Action() est bien lancé apres que le pointeur soit correctement definit
Interface::Action(){
    pointeur->GetId() // Segmentation Fault
};


dimanche 19 novembre 2006 à 14:28:08 | Re : Disparition de pointeurs sur classes derivees

vecchio56

Administrateur CodeS-SourceS
Aucun problème pour moi
Montre un peu plus de code sinon c'est difficile de savoir d'ou vient ton problème

#include <iostream>
using namespace std;

class Mere{
public :
  virtual int GetId(){ return -1; }
};

class Fille : public Mere {
public :
  virtual int GetId(){ return 5; }
};

class Interface{
  Mere* pointeur;
public :
  Interface::Interface()
  {
    pointeur = new Fille();
    pointeur->GetId();
  }

  int Action()
  {
    return pointeur->GetId();
  }
};

int main()
{
  Interface i = Interface();
  cout << i.Action() << endl;
}

_____________________________________
Un éditeur de ressources gratuit pour Windows

dimanche 19 novembre 2006 à 15:31:49 | Re : Disparition de pointeurs sur classes derivees

Natural M

// list_base.h

class List_Base : public wxTreeCtrl
{
   public :
      List_Base() : wxTreeCtrl( ){};
      virtual wxString& GetName(){ return name; };

      wxString name;

   private :
      DECLARE_DYNAMIC_CLASS( List_Base)
};

class List_Main :  public List_Base{

   DECLARE_DYNAMIC_CLASS( List_Main)

   public :
      List_Main() : List_Base(){
         name = "Liste principale";
      };
      bool Init();
      wxString& GetName(){ return name; };

      wxString name;

   protected :
      DECLARE_EVENT_TABLE();
};

// list.h
class List : wxEvtHandler{

   public :
      List(){
            list_ptr.reset( new List_Main() );
            // fonctionne
           wxMessageBox( list_ptr->GetName() );
      };
       /** fonction appelée en cours d'execution par l'utilisateur */
      void Action() {
          // fonctionne
           wxMessageBox( list_ptr->GetName() );
       };
       /** pointeur List_Main*, qu'il soit gere par Boost ou autre chose ne change rien */
      boost::scoped_ptr<List_Main> list_ptr;
};

Voilà, il y a donc ma classe de base List_Base, ma classe derivée List_Main, Ma classe qui doit gerer mes classes derivées List.
Mon pointeur list_ptr, et ma fonction Action() qui est appelée en cours d'execution par l'utilisateur. Entre List() et Action() il ne se passe rien de special.
Les instructions sont simples, l'absence de DECLARE_DYNAMIC_CLASS (wxWidget) de change rien. L'utilisation des pointeurs stl ne change rien non plus.
dimanche 19 novembre 2006 à 15:34:26 | Re : Disparition de pointeurs sur classes derivees

Natural M

void Action() {
     // ne fonctionne pas [ rectification du post precedent ]
     wxMessageBox( list_ptr->GetName() );
};
dimanche 19 novembre 2006 à 23:54:58 | Re : Disparition de pointeurs sur classes derivees

Natural M

Si je fait ( (wxTreeCtrl*)list_ptr )->GetCount(); j'arrive a utiliser le pointeur. Le pointeur fonctionne donc pour les classes derivées créée par la librairie wxWidget.
On dirait que les informations de type de mes classes se sont perdues en sortant de ma fonction constructeur.
lundi 20 novembre 2006 à 14:10:01 | Re : Disparition de pointeurs sur classes derivees

Natural M

Réponse acceptée !
Probleme resolut !

J'ai retravaillé mes classes pr faire remonter la classe wxTreeCtrl de wxWidget au niveau de ma derniere classe derivée.
Le compilateur m'a indiqué une ambiguité au niveau de la fonction GetName(), en effet, celle-ci était deja definie par une classe de base de wxTreeCtrl.
Le compilateur ne l'avait probablement pas detecté a cause des quelques niveau hierarchique separant le GetName() de wxWidget et le mien.

wxObject->wxWindow->wxControl->wxTreeCtrl->List_Base->List_Main

C'était donc simplement un conflit non repere par gcc.
Me voilà prevenu^^


Cette discussion est classée dans : public, objet, pointeur, fille, mere


Répondre à ce message

Sujets en rapport avec ce message

problème de pointeur et d'objet pointé [ par leptit ] Bonjour, Je vous présente le problème en C:struct assoc { int l, *n ; }*n est un pointeur vers une alloc dynamique de memoirestyle tableau d'entier.Je Comment faire heriter un objet ATL d un autre objet ATL [ par moiss2 ] Bonjour,je developpe avec visual C++ en utilisant ATL/COM pour creer un dll qui donne acces a deux objets A et B qui heritent l un de l autre (B de A) PROB avec pointeur THIS [ par jfk20004 ] Salut,tout ce que je sais à propos du pointeur this:-c'est un pointeur sur l'adresse d'un objet-il permet des appels en cascade de fonctionsquelqu'un test du pointeur [ par jeltimed ] bonjour .en fait je suis débutant en c++ et je voulais juste savoir est ce que ya moyen d'appliquer la logique suivant en c++: si pointeur pointe Problemes de variable avec fenetre mere et fille [ par titi4659 ] Bonjour,j'ai un problème, on va dire de dialogue, entre une fenetre mère et une fenetre fille c'est à dire:J'ai une fenetre dans laquelle je rempli di déterminer dynamiquement le type d'un objet pointé [ par feanor11 ] Sachant qu'un pointeur est capable de pointer sur un objet d'un type dérivé à son type respectif (si A est dérivée de B, A* peut pointer sur un objet Objet et pointeur, souci [ par TuxOnline ] Bonjour j'ai un petit souci pour l'envoie de l'adresse d'un pointeur.Voila j'ai donc une classe CMAnifestation. Dans cette classe se trouve un objet v Creer un catalogue d'objets pour un noyau d'application [ par rick_moins_moins ] Bonjour à tous, merci pour ceux qui pourront m'apporter leur aide. J'ai un projet c++ à faire et je n'arrive pas à le faire (il me reste qu'10 jours p Question simple, STL c++, ( indexation d'objet ) [ par Wiiip ] Bonjour, merci, Je suppose que ce n'est pas bien compliqué, et que l'on doit pouvoir faire cela facilement avec la stl. Je cherche à faire un index po Probleme de Débutant [ par Dorgendubal ] Hello à tous,j'ai déjà programmé en C++ et même avec des envirronements graphiques (comme QT sous linux) mais jamais avec Visual C++.Alors j'ai un pro


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales