#1 Le 20/08/2008, à 19:13
- rniamo
constructeur et variable non disposnible ?
bonjour,
je modifie un programme c++ et j'ai un soucis, j'ai besoin d'utiliser la variable texte de la classe Fenetre dans la classe HautFenetre mais je dois le faire dans le constructeur de fenetre => seg fault au lancement du programme.
Comment faire ?
en (trés) gros :
class Fenetre;
class HautFenetre {
private :
Fenetre* f;
public:
...
setFenetre(Fenetre *f) {
var v=f->getClassAMoi();
}
};
class Fenetre {
private:
HautFenetre hf;
classAMoi texte;
public: ...
Fenetre() {
hf.setFenetre(this);
}
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#2 Le 20/08/2008, à 20:08
- in_vino_veritas
Re : constructeur et variable non disposnible ?
Plus besoin de 'new' en c++ ?
Sinon, il ne manque pas un this.f = f dans setFenetre ?
XPS M1530: T9300/4Go/200Go-7200tpm/8600M GT/Vista
Hors ligne
#3 Le 20/08/2008, à 20:26
- rniamo
Re : constructeur et variable non disposnible ?
si mais tout ça y est, le (vrai) code compile.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#4 Le 20/08/2008, à 20:30
- Link31
Re : constructeur et variable non disposnible ?
var v=f->getClassAMoi();
Ça c'est du Javascript (le type auto sera disponible en C++-0x pour ce genre de chose).
Pour ton problème : tant que le constructeur n'a pas terminé son exécution, l'objet n'est pas construit. Donc ce n'est pas une bonne idée d'utiliser un pointeur vers cet objet tant que sa construction n'est pas terminée.
Il doit y avoir des cas où c'est possible, mais je sais déjà qu'on ne peut pas appeler de fonctions virtuelles d'une classe à l'intérieur de son constructeur. Il y a peut-être d'autres problèmes potentiels dans ce genre de situation.
En plus, ta fonction getClassAMoi() n'est pas présente dans ton code. On ne sait pas si elle est virtuelle. Et si ça se trouve, c'est elle-même qui cause une segfault.
edit : et tu devrais écrire setFenetre(Fenetre *f2) et f2->getClassAMoi(), évidemment.
Dernière modification par Link31 (Le 20/08/2008, à 20:33)
Hors ligne
#5 Le 20/08/2008, à 20:47
- rniamo
Re : constructeur et variable non disposnible ?
j'ai mis var pour ne pas mettre de type précis ("Texte" ne vous aurez pas aidé). getClassAMoi() n'est pas virtuelle (aucune dans ce programme).
Le problème est celui que j'ai dit : je veux accéder aux variable d'une classe pendant sa constrution (enfin dans son constructeur).
edit : j'explique ce que je veux faire : je charge les parties textes de mon interface dans un tableau alloué de std::string à partir d'un fichier. je fais cela dans interface qui contient mes différentes parties de fenêtre. Ces différentes aprties sont des classes qui contiennents un pointeur sur ma classe fenetre. Je veux initialiser les parties textes à partir de ce tableau (std::string * plutôt).
Dernière modification par rniamo (Le 20/08/2008, à 21:00)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 21/08/2008, à 14:47
- thy
Re : constructeur et variable non disposnible ?
Il faudrait voir le code qui utlise ces classes pour mieux comprendre ce que tu veux faire
Hors ligne
#7 Le 21/08/2008, à 17:41
- rniamo
Re : constructeur et variable non disposnible ?
il est complexe, mais le problème vient de là, j'ai besoin de l'objet fenêtre pour contruire les objet composant la fenêtre
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#8 Le 21/08/2008, à 18:21
- Link31
Re : constructeur et variable non disposnible ?
Ce genre de dépendance entre classes est souvent signe d'un mauvais design du code. D'autant plus que ce n'est pas la première fois que tu postes une question portant sur de l'interdépendance de classes.
Pourquoi ne pas faire une classe Fenêtre qui représenterait... une fenêtre, en entier ? Ou alors une classe Fenêtre, une classe abstraite Widget et une classe HautFenêtre implémentant Widget, les Widgets eux-mêmes n'ayant aucune connaissance de l'objet qui les contient (en l'occurrence : Fenêtre) ?
Dernière modification par Link31 (Le 21/08/2008, à 18:22)
Hors ligne
#9 Le 21/08/2008, à 18:44
- rniamo
Re : constructeur et variable non disposnible ?
ce n'est pas la première fois, c'est la même, en fait je dois faire quelques modifications sur ce code. Le problème est que j'ai mis dans fenêtre des variables qui auraient duent être dans une classe "Gestion" ou "VariablesGlobale". Donc oui la conception est ici à l'envers mais se serait trop long de tout reprendre.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#10 Le 21/08/2008, à 19:49
- Link31
Re : constructeur et variable non disposnible ?
Il n'y a que deux manières de programmer correctement.
Soit on modélise toute l'application avant d'écrire la moindre ligne de code, et on s'en tient au modèle (qui normalement ne souffre d'aucune faille de conception) pendant toute la période de développement.
Soit on ne modélise rien et on improvise, ce qui est parfois plus efficace pour un programmeur isolé, mais dans ce cas il faut se préparer à réécrire régulièrement de grandes parties du code quand on tombe sur un problème insoluble, ou quand on se retrouve à devoir écrire du code fragile ou moche, ou quand on découvre un nouveau motif de conception bien plus adapté.
Si tu as le moindre doute sur ton code, je te conseille très franchement d'envisager une phase de refactoring. Tu verras que ton code sera plus beau, plus solide, et plus simple / plus agréable à faire évoluer.
Hors ligne
#11 Le 21/08/2008, à 19:56
- rniamo
Re : constructeur et variable non disposnible ?
je l'ai enviseagé hors vu ce qu'il me reste à faire ça ne vaut pas le coup. (je le reprendré certainement avec gnome 3 et la version gtkmm qui va avec).
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#12 Le 22/08/2008, à 02:00
- thy
Re : constructeur et variable non disposnible ?
pourquoi ne pas rajouter une methode setParent a la classe fenetre
void setParent (HautFenetre hf)
{
hf.setFenetre(this);
}
Hors ligne
#13 Le 22/08/2008, à 08:49
- rniamo
Re : constructeur et variable non disposnible ?
je ne comprends pas ce que ça change, il faudrait utiliser cette méthode dans le constructeur de Fenetre de toute façon, non ?
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#14 Le 01/09/2008, à 15:19
- thy
Re : constructeur et variable non disposnible ?
non, rien ne t'oblige à l'appeler dans le constructeur.
Hors ligne
#15 Le 01/09/2008, à 17:51
- Link31
Re : constructeur et variable non disposnible ?
void setParent (HautFenetre hf) { hf.setFenetre(this); }
void setParent (HautFenetre& hf)
Hors ligne