Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées C1 et
C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere, C1
ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec un
new.
J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai
type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment
puis-je faire ca?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien SK
Ben wrote:
J'ai essayé ça dans ma fonction : CMere& NewObjet = new CMere(objet);
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment puis-je faire ca?
Faire dans la classe "CMere" une méthode "virtual CMere* Clone()" qui pour chaque classe fille retourne la copie de l'objet concret.
CMere* CPetiteFille::Clone()const { return new CPetiteFille(*this); }
Ben wrote:
J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai
type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment
puis-je faire ca?
Faire dans la classe "CMere" une méthode "virtual CMere* Clone()" qui
pour chaque classe fille retourne la copie de l'objet concret.
CMere* CPetiteFille::Clone()const
{
return new CPetiteFille(*this);
}
J'ai essayé ça dans ma fonction : CMere& NewObjet = new CMere(objet);
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment puis-je faire ca?
Faire dans la classe "CMere" une méthode "virtual CMere* Clone()" qui pour chaque classe fille retourne la copie de l'objet concret.
CMere* CPetiteFille::Clone()const { return new CPetiteFille(*this); }
Christophe de Vienne
Ben wrote:
Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées C1 et C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere, C1 ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec un new. J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Cette écriture n'est pas tellement recommandée. N'oublie pas qu'il faut détruire ton instance à un moment ou un autre, et écrire : delete &NewObjet; porte encore plus à confusion que la précédente ligne...
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment puis-je faire ca?
La solution classique est de créer une méthode virtuelle clone() dans la classe mère qui est surdéfinie dans les classes enfants.
class CMere { public: // ...
virtual public CMere * clone() { return new CMere(*this); }; };
class CFille : public CMere { public: // ...
virtual public CFille * clone() { return new CFille(*this); }; ^^^^^^ // note que le type de retour de la fonction a changé. Cela est // valide selon le principe de substitution, mais ne fonctionne // pas avec certain compilateurs (VC6 notament). Il faut alors // laisser CMere * comme type de retour. };
Pour dupliquer l'objet il suffit alors de faire :
CMere * NewObjet = objet->clone();
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Ben wrote:
Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées C1
et C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere, C1
ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec un
new.
J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Cette écriture n'est pas tellement recommandée. N'oublie pas qu'il faut
détruire ton instance à un moment ou un autre, et écrire :
delete &NewObjet;
porte encore plus à confusion que la précédente ligne...
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai
type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors
comment puis-je faire ca?
La solution classique est de créer une méthode virtuelle clone() dans la
classe mère qui est surdéfinie dans les classes enfants.
class CMere {
public:
// ...
virtual public CMere * clone() { return new CMere(*this); };
};
class CFille : public CMere {
public:
// ...
virtual public CFille * clone() { return new CFille(*this); };
^^^^^^
// note que le type de retour de la fonction a changé. Cela est
// valide selon le principe de substitution, mais ne fonctionne
// pas avec certain compilateurs (VC6 notament). Il faut alors
// laisser CMere * comme type de retour.
};
Pour dupliquer l'objet il suffit alors de faire :
CMere * NewObjet = objet->clone();
A+
Christophe
--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.
Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées C1 et C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere, C1 ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec un new. J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Cette écriture n'est pas tellement recommandée. N'oublie pas qu'il faut détruire ton instance à un moment ou un autre, et écrire : delete &NewObjet; porte encore plus à confusion que la précédente ligne...
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment puis-je faire ca?
La solution classique est de créer une méthode virtuelle clone() dans la classe mère qui est surdéfinie dans les classes enfants.
class CMere { public: // ...
virtual public CMere * clone() { return new CMere(*this); }; };
class CFille : public CMere { public: // ...
virtual public CFille * clone() { return new CFille(*this); }; ^^^^^^ // note que le type de retour de la fonction a changé. Cela est // valide selon le principe de substitution, mais ne fonctionne // pas avec certain compilateurs (VC6 notament). Il faut alors // laisser CMere * comme type de retour. };
Pour dupliquer l'objet il suffit alors de faire :
CMere * NewObjet = objet->clone();
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Christophe de Vienne
Christophe de Vienne wrote:
class CMere { public: // ...
virtual public CMere * clone() { return new CMere(*this); }; };
J'ai oublié un const : virtual public CMere * clone() const { return new CMere(*this); }
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Christophe de Vienne wrote:
class CMere {
public:
// ...
virtual public CMere * clone() { return new CMere(*this);
};
};
J'ai oublié un const :
virtual public CMere * clone() const {
return new CMere(*this);
}
A+
Christophe
--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.
virtual public CMere * clone() { return new CMere(*this); }; };
J'ai oublié un const : virtual public CMere * clone() const { return new CMere(*this); }
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Ben
Cool ca marche merci bien. "Christophe de Vienne" wrote in message news:newscache$hb19lh$awg$
Ben wrote:
Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées C1
et C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere, C1
ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec un
new. J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Cette écriture n'est pas tellement recommandée. N'oublie pas qu'il faut détruire ton instance à un moment ou un autre, et écrire : delete &NewObjet; porte encore plus à confusion que la précédente ligne...
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai
type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment puis-je faire ca?
La solution classique est de créer une méthode virtuelle clone() dans la classe mère qui est surdéfinie dans les classes enfants.
class CMere { public: // ...
virtual public CMere * clone() { return new CMere(*this); };
};
class CFille : public CMere { public: // ...
virtual public CFille * clone() { return new CFille(*this); };
^^^^^^ // note que le type de retour de la fonction a changé. Cela est
// valide selon le principe de substitution, mais ne fonctionne
// pas avec certain compilateurs (VC6 notament). Il faut alors
// laisser CMere * comme type de retour. };
Pour dupliquer l'objet il suffit alors de faire :
CMere * NewObjet = objet->clone();
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Cool ca marche merci bien.
"Christophe de Vienne" <cdevienne@alphacent.com> wrote in message
news:newscache$hb19lh$awg$1@guronzan.alphacent.com...
Ben wrote:
Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées
C1
et C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere,
C1
ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec
un
new.
J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Cette écriture n'est pas tellement recommandée. N'oublie pas qu'il faut
détruire ton instance à un moment ou un autre, et écrire :
delete &NewObjet;
porte encore plus à confusion que la précédente ligne...
Mais l'ennuie est que je crees un objet de type CMere et non pas du
"vrai
type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors
comment puis-je faire ca?
La solution classique est de créer une méthode virtuelle clone() dans la
classe mère qui est surdéfinie dans les classes enfants.
class CMere {
public:
// ...
virtual public CMere * clone() { return new
CMere(*this); };
};
class CFille : public CMere {
public:
// ...
virtual public CFille * clone() { return new
CFille(*this); };
^^^^^^
// note que le type de retour de la fonction a changé.
Cela est
// valide selon le principe de substitution, mais ne
fonctionne
// pas avec certain compilateurs (VC6 notament). Il faut
alors
// laisser CMere * comme type de retour.
};
Pour dupliquer l'objet il suffit alors de faire :
CMere * NewObjet = objet->clone();
A+
Christophe
--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.
Cool ca marche merci bien. "Christophe de Vienne" wrote in message news:newscache$hb19lh$awg$
Ben wrote:
Voilà j'ai une classe parent, appelons la CMere, et 2 classes dérivées C1
et C2; ensuite j'ai une fonction comme suit :
void fonction(CMere& objet)
Je souhaite passer à cette fonction n'importe quel objet de type CMere, C1
ou C2 et ensuite réaliser une copie de cet objet dans ma fonction avec un
new. J'ai essayé ça dans ma fonction :
CMere& NewObjet = new CMere(objet);
Cette écriture n'est pas tellement recommandée. N'oublie pas qu'il faut détruire ton instance à un moment ou un autre, et écrire : delete &NewObjet; porte encore plus à confusion que la précédente ligne...
Mais l'ennuie est que je crees un objet de type CMere et non pas du "vrai
type" de objet (dans le cas d'un objet C1 ou C2 par exemple). Alors comment puis-je faire ca?
La solution classique est de créer une méthode virtuelle clone() dans la classe mère qui est surdéfinie dans les classes enfants.
class CMere { public: // ...
virtual public CMere * clone() { return new CMere(*this); };
};
class CFille : public CMere { public: // ...
virtual public CFille * clone() { return new CFille(*this); };
^^^^^^ // note que le type de retour de la fonction a changé. Cela est
// valide selon le principe de substitution, mais ne fonctionne
// pas avec certain compilateurs (VC6 notament). Il faut alors
// laisser CMere * comme type de retour. };
Pour dupliquer l'objet il suffit alors de faire :
CMere * NewObjet = objet->clone();
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Christophe de Vienne
Ben wrote:
Cool ca marche merci bien.
De rien !
Au passage, jette un oeil à <http://www.giromini.org/usenet-fr/repondre.html>. Merci :-)
A+
Christophe
-- Christophe de Vienne Experience is something you don't get until just after you need it. Oliver's Law.
Ben wrote:
Cool ca marche merci bien.
De rien !
Au passage, jette un oeil à
<http://www.giromini.org/usenet-fr/repondre.html>. Merci :-)
A+
Christophe
--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.