#1 Le 20/06/2008, à 16:46
- rniamo
c++ redéfinir une fonction virtual
bonjour,
j'ai une classe A avec une méthode
virtual void fa();
et une classe B avec comme membre private une instance de A.
Je veux redéfinir f() pour l'adapter à B et pouvoir y utiliser this (représentant un pointeur sur une instance de B).
Comment faire ?
NB : A et B hérite de classes différentes.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#2 Le 20/06/2008, à 16:51
- castorgris
Re : c++ redéfinir une fonction virtual
bonjour,
(...)
Comment faire ?
c'est simple, il te suffit de prendre tes doigts, ton clavier et de tapper la fonction qvb
/me est déjà dehors
Windowsiens libérés : 10
/me a fait une rechute, finalement, 7 ça marche pas si mal.
Hors ligne
#3 Le 20/06/2008, à 16:52
- rniamo
Re : c++ redéfinir une fonction virtual
en fait j'attendais une réponse sérieuse
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#4 Le 20/06/2008, à 16:55
- telliam
Re : c++ redéfinir une fonction virtual
dsl, j'ai pas tout compris
peux tu fournir un pseudo code de la facon dont tu aimerai utilisé la fonction f?
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#5 Le 20/06/2008, à 16:58
- rniamo
Re : c++ redéfinir une fonction virtual
En gros j'ai une classe hériter du type fenetre et une classe hériter du type barre d'outils. Je veux redéfinir les action de barre d'outils par rapport à ma fenere :
class BarreOutils : public ...
{
private :
...
virtual void fa();
public : constructeur....
}
class fenetre : public ...
{
private :
... BarreOutils ba;
public : constructeur....
}
Fenetre::Fenetre()
{
ajout(ba) ; // fa est propre à ba et ne copnnait pas les membres de la fenetre, hors je veux pouvoir avoir accés à ces membres.
}
edit : le problème est que je veux redéfinir une fonction sans hériter de la classe
Dernière modification par rniamo (Le 20/06/2008, à 17:12)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 20/06/2008, à 17:34
- rniamo
Re : c++ redéfinir une fonction virtual
Si ce n'est pas possible, c'est pas grave, je mets tout dans ma classe d'interface.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#7 Le 20/06/2008, à 23:15
- Link31
Re : c++ redéfinir une fonction virtual
Je vois plusieurs solutions, regarde celle qui te conviendrait.
Avec un argument (mais tu vas perdre l'intérêt de ta fonction virtuelle) :
class fenetre; // déclaration anticipée
class BarreOutils : public ...
{
private :
...
void fa(fenetre& f); // ce n'est plus la même fonction !
public : constructeur...
}
void BarreOutils::fa(fenetre& f)
{
// utiliser f
}
class fenetre : public ...
{
private :
void dshgfhx();
... BarreOutils ba;
public :
fenetre()
: ba(*this)
{}
}
void fenetre::dshgfhx()
{
// utiliser la nouvelle fonction fa()
ba.fa(*this);
}
Avec une référence (tu ne pourras plus changer de fenêtre après la création de ton instance de BarreOutils) :
class fenetre; // déclaration anticipée
class BarreOutils : public ...
{
private :
...
virtual void fa();
fenetre& mFenetre;
public :
BarreOutils(fenetre& f);
}
class fenetre : public ...
{
private :
... BarreOutils ba;
public :
fenetre()
: ba(*this)
{}
}
BarreOutils::BarreOutils(fenetre& f)
: mFenetre(f)
{}
void BarreOutils::fa()
{
// utiliser f
}
Avec un pointeur (tu pourras changer de fenêtre, mais les pointeurs, saimal) :
class fenetre; // déclaration anticipée
class BarreOutils : public ...
{
private :
...
virtual void fa();
fenetre* mFenetre;
public :
BarreOutils(fenetre* f = 0);
inline void setFenetre(fenetre* f)
{ mFenetre = f; }
fenetre* getFenetre()
{ return mFenetre; }
}
BarreOutils::BarreOutils(fenetre* f)
: mFenetre(f)
{}
void BarreOutils::fa()
{
if (f)
{
// utiliser f
}
}
Dernière modification par Link31 (Le 20/06/2008, à 23:18)
Hors ligne
#8 Le 21/06/2008, à 13:13
- rniamo
Re : c++ redéfinir une fonction virtual
oui mais celà m'oblige à mettre dans barreOutils un membre de type fenetre (ou un pointeur ou une référence...enfin il faut que feneetre soit défini) hors je veux définir fenetre avec barreOutils ... ça en me parait pas logique de ce point de vue. Surtout que la fonction était virtual pour pouvoir être redéfini mais en fait comme je ne fait pas d'héritage ça ne sert à rien, si ? Je préfére ne pas trop se faire croisée mes classes, je trouve ça plus propre. Ai-je tord ?
[mode troll]Sinon : les pointeurs c'est bien et les références ne sont que des pointeurs cachés.[/mode troll]
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#9 Le 21/06/2008, à 16:24
- Link31
Re : c++ redéfinir une fonction virtual
oui mais celà m'oblige à mettre dans barreOutils un membre de type fenetre (ou un pointeur ou une référence...enfin il faut que feneetre soit défini) hors je veux définir fenetre avec barreOutils ... ça en me parait pas logique de ce point de vue.
Quand tu fais une déclaration anticipée, tu peux déclarer des pointeurs ou des références vers la classe déclarée (mais pas créer une instance de la classe tant qu'elle n'est pas complètement définie).
Surtout que la fonction était virtual pour pouvoir être redéfini mais en fait comme je ne fait pas d'héritage ça ne sert à rien, si ? Je préfére ne pas trop se faire croisée mes classes, je trouve ça plus propre. Ai-je tord ?
L'intérêt des fonctions virtuelles, c'est justement avec l'héritage. Si tu ne fais pas d'héritage, pas besoin de fonction virtuelles.
Et tu n'as pas tellement le choix de ne pas croiser tes classes, puisqu'elles dépendent l'une de l'autre.
[mode troll]Sinon : les pointeurs c'est bien
et les références ne sont que des pointeurs cachés.[/mode troll]
Ce n'est pas un troll, c'est tout simplement faux. Une référence pointe toujours vers un objet valide, à moins de coder vraiment n'importe comment (c'est-à-dire de le faire vraiment exprès). Un pointeur peut pointer n'importe où. S'il pointe vers 0, tu peux le vérifier (et encore, il ne faut pas oublier une seule vérification, sinon...). Mais s'il pointe ailleurs, tu n'as aucune garantie qu'il pointe bien vers un objet valide.
Les pointeurs en C++, c'est à utiliser seulement quand on n'a pas le choix, et c'est bien plus rare que l'on croit.
Hors ligne
#10 Le 21/06/2008, à 17:32
- rniamo
Re : c++ redéfinir une fonction virtual
et les listes chainée ? comment on fait pour le "bout" ?
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#11 Le 21/06/2008, à 18:15
- Link31
Re : c++ redéfinir une fonction virtual
std::list<int> mylist;
std::list<int>::iterator it = // ...
if (it == mylist.end())
{
// ...
}
Pas besoin de pointeurs.
Hors ligne
#12 Le 21/06/2008, à 20:23
- rniamo
Re : c++ redéfinir une fonction virtual
oui mais c'est quand même bien de savoir faire (soi-même ) et sans pointeurs c'est dur.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#13 Le 24/06/2008, à 11:42
- rniamo
Re : c++ redéfinir une fonction virtual
links31, tu peux m'expliquer un petit détails : pourquoi avec une référence je ne peux pas changer de fenêtre si je mets "fenetre &f" et non "cont fenetre &f" ?
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#14 Le 24/06/2008, à 11:55
- Link31
Re : c++ redéfinir une fonction virtual
Une référence ne se change pas. Elle représente un objet donné dès sa création, et ne peut être modifiée pour représenter un autre objet. Ce n'est pas un pointeur.
Hors ligne
#15 Le 24/06/2008, à 11:56
- rniamo
Re : c++ redéfinir une fonction virtual
Ok, merci.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#16 Le 24/06/2008, à 12:02
- rniamo
Re : c++ redéfinir une fonction virtual
j'essaye ta méthode avec la référence mais à la compilation :
toolbar.cc:6: erreur: invalid use of incomplete type «struct Fenetre»
toolbar.hh:9: erreur: forward declaration of «struct Fenetre»
J'ai mal recopié quelquechose ?
#ifndef TOOLBAR_HH
#define TOOLBAR_HH
#include <gtkmm.h>
using namespace std;
using namespace Gtk;
class Fenetre;
class ToolbarNav : public Toolbar
{
private:
ToolButton tb_prec;
ToolButton tb_up;
ToolButton tb_quitter;
ToolButton tb_home;
ToolButton tb_ok;
ToolItem barreAdresse;
HBox cheminBox;
Label cheminLabel;
Entry entryAdresse;
ToolButton tb_zoom;
ToolButton tb_dezoom;
Fenetre &f;
virtual void goUp(void);
virtual void goHome(void);
virtual void goEntry(void);
virtual void quitter(void);
virtual void tb_cb_prec();
virtual void zoom(void);
virtual void dezoom(void);
public:
ToolbarNav(Fenetre& f);
};
#endif
edit : la classe fenetre est dans un autre fichier, c'est grave ?
edit 2 : je suis bête il manquait un #include "fenetre.hh"
Maintenant j'ai :
interface.hh:41: erreur: «ToolbarNav» does not name a type
Dernière modification par rniamo (Le 24/06/2008, à 12:08)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#17 Le 24/06/2008, à 12:23
- robrob
Re : c++ redéfinir une fonction virtual
ben il faut un include "toolbar.hh" dans interface.hh
Hors ligne
#18 Le 24/06/2008, à 12:49
- rniamo
Re : c++ redéfinir une fonction virtual
celui là il y était mais il manquait un class Toolbar;
Mais j'ai :
erreur: field «toolbar» has incomplete type
En fait je veux créer un membre ToolBar dans Fenetre mais il n'en veut pas .
Je ne trouve pas cette façon de faire super propre, si ?
Dernière modification par rniamo (Le 24/06/2008, à 12:53)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#19 Le 24/06/2008, à 12:54
- Link31
Re : c++ redéfinir une fonction virtual
Pas de using namespace dans un fichier header (et à utiliser avec parcimonie dans les .cc).
Hors ligne
#20 Le 24/06/2008, à 12:57
- rniamo
Re : c++ redéfinir une fonction virtual
Je les utilise parce que je ne veux pas écrire std:: et Gtk:: tout le temps (même dans les .hh). C'est les deux seuls que j'utilise.
Pour mon problème Toolbar/fenetre : en fait c'est pas possible de déclarer un membre toolbar dans fenetre sans que se soit une référence donc autant tout mettre dans fenetre.
Dernière modification par rniamo (Le 24/06/2008, à 13:02)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#21 Le 24/06/2008, à 13:02
- Link31
Re : c++ redéfinir une fonction virtual
C'est un choix. Sauf qu'on ne peut pas annuler un using namespace en C++, et les fichiers headers étant destinés à être réutilisés, ça va poser des problèmes aux autres programmeurs qui font eux un usage correct des espaces de noms.
Si tu es tout seul sur le projet tu ne vas pas avoir trop de problèmes dans l'immédiat (à part des collisions de noms comme dans le cas de ton enum FILE, ce qui est déjà assez grave en soi). Mais c'est une mauvaise habitude dont il faut se débarrasser.
Dans le cas de classes qui dépendent l'une de l'autre, le seul moyen est de créer une classe intermédiaire et d'utiliser cette classe, le polymorphisme s'occupant du reste.
Dernière modification par Link31 (Le 24/06/2008, à 13:05)
Hors ligne
#22 Le 24/06/2008, à 13:08
- rniamo
Re : c++ redéfinir une fonction virtual
Pour les using namespace j'ai compris mais là je suis tout seul et ça me simplifie la vie.
Pour les classes qui dépendent l'une de l'autre, je ne vois pas comment faire ici, c'est pour ça que je mets tout dans le même fichier :
une partie de la fenêtre doit avoir accès aux memebre de la fenêtre complète donc sans paser par pointeurs c'est difficile et je trouve ça sale.
Je ne vois pas quel classe intermédiaire faire.
Dernière modification par rniamo (Le 24/06/2008, à 13:09)
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#23 Le 24/06/2008, à 13:29
- Link31
Re : c++ redéfinir une fonction virtual
La classe intermédiaire ClasseIntermédiaire doit contenir l'interface (si elle n'est pas déjà définie plus haut dans la hiérarchie) et tout ce qui ne dépend pas du membre fenetre. La classe finale ClasseFinale (dérivée de la classe intermédiaire) contient le membre fenetre et les méthodes qui dépendent de ce membre.
Dans ta classe fenetre, tu as un objet de type ClasseIntermédiaire nommé par exemple mToolbar.
Dans la liste d'initialisation du constructeur de fenetre, il faut le construire avec mToolbar(ClasseFinale()).
Si la classe fenetre doit accéder à une fonction fonction() de ClasseFinale, il faut utiliser static_cast<ClasseFinale*>(&mToolbar)->fonction().
Une autre solution pour éviter le static_cast serait de définir la fonction en tant que virtuelle pure dans ClasseIntermédiaire, mais il faut dans ce cas que mToolbar soit un pointeur de ClasseIntermédiaire, et il faut l'initialiser avec mToolbar(new ClasseFinale()) et ne pas oublier de libérer la mémoire dans le destructeur de fenetre (ou utiliser un scoped pointer).
Dernière modification par Link31 (Le 24/06/2008, à 13:30)
Hors ligne
#24 Le 24/06/2008, à 13:33
- rniamo
Re : c++ redéfinir une fonction virtual
Je ne vois pas ce que ça change par rapport aux classe toolbar/fenetre (désolé, je suis un peu long à la détente mais j'ai l'impression que l'on croise encore).
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#25 Le 24/06/2008, à 13:43
- Link31
Re : c++ redéfinir une fonction virtual
Ben faut voir ce que tu veux. Ta question initiale n'était pas forcément claire. Je t'ai montré comment utiliser fenetre depuis toolbar avec une référence (puisque la barre d'outils n'est pas censée changer de fenêtre), et comment utiliser toolbar depuis fenetre sans référence (puisque fenetre peut très bien utiliser des barres d'outils différentes).
Avec ça, tu devrais y arriver. N'oublie pas que c'est toi qui connais le mieux ton code et ce que tu veux en faire, et que c'est particulièrement difficile en C++ de comprendre le code et les concepts de quelqu'un d'autre.
Hors ligne