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^^
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.
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)
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.
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.