Rechercher : dans
Par :

Problème surcharge operator= C++

Dernière réponse le 26 jun 2008 à 14:07:28 cyberlulu, le 26 jun 2008 à 11:36:43 
 Signaler ce message aux modérateurs

Bonjour,

Voici mon problème au niveau de la surcharge de l'opérateur =.
J'ai une classe B qui hérite publiquement de A.
Dans la classe A, je définis l'opérator=. Je fais de même dans la classe B.
Dans mon code, j'écris :
A *objet1 = new B;
A *objet2 = new B;

à un moment je fais *objet1 = *objet2.

Mon problème est que l'affectation ne se fait qu'en passant dans operator= de la classe A et pas la B. Ce que je voudrais c'est que l'affectation détecte que j'ai des objets de type B et que mon exécution passe dans l'operator= de B et que dans cet operator= de B je fasse appel à celui de A au début.

Comment est-ce que je peux faire pour avoir ce résultat.

Merci d'avance

Configuration: Windows XP
Firefox 3.0

Meilleures réponses pour « Problème surcharge operator= C++ » dans :
Surcharge des opérateurs Voir Surcharge des opérateurs Comme la plupart des langages, le C++ fournit un ensemble d’opérateurs pour manipuler ses types intégrés (int, float, char, etc.). Vous savez déjà, par exemple, que x+y*z se traduit par « multiplier y et z puis ajouter le...
Les templates en C++ VoirIntroduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
Les fonctions en C++ : surcharge et paramètres par défaut. VoirLes fonctions en C++ : surcharge et paramètres par défaut. 1. La surcharge de fonctions et méthodes de classes, dont le constructeur 2. Utilisation des paramètres par défaut En C++, une même fonction ou méthode de classe peut être...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les opérateurs VoirQu'est-ce qu'un opérateur ? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, etc. On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs...
Langage C++ - Les fonctions VoirLa notion de fonction On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...

1

Char Snipeur, le 26 jun 2008 à 12:21:46

8-/
objet1 est de type A, comment veux tu qu'il aille chercher un membre de la classe B ??
Ce que tu demande est tout simplement impossible, comment le compilateur peux deviner ?
Tu peux faire un typage sauvage :
*(B*)objet1=*objet2;
là, il devrais appeler la méthode B::opertor=(A).
As tu bien défini operator= virtuel ?
si oui, essai objet1->operator=(*objet2); Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

2

cyberlulu, le 26 jun 2008 à 13:53:47

Euh... ben non mon objet 1 est de type B, je fais bien : A *objet = new B; comme pour l'objet2. ils sont tous les deux de même type.
et sinon la méthode operator= est bien en virtuelle. J'ai d'ailleurs fait le test avec une autre méthode et ca fonctionne sans problème, mais pas pour l'operator=.
donc si qqun a une idée...

Répondre à cyberlulu

3

 Char Snipeur, le 26 jun 2008 à 14:07:28

Non, objet1 est de type A* !
A*objet1=new B;
veux dire que tu déclare une variable de nom "objet1" qui est un pointeur sur une classe de type A !
Et ensuite, tu fait pointé objet1 sur une classe de type B (new B).
donc, *objet1 est vu par le compilateur comme étant de type A et non de type B.
Ensuite, par dessus, il y a le polymorphisme qui viens se greffer dessus. Lorsque tu as un pointeur de classe et que tu appel une méthode, si celle ci est virtuelle, il regarde dans la v-table quelle fonction utiliser.
D'un autre coté, tu fait *obj1=*obj2. Mettons qu'il comprenne le polymorphisme dans ce cas là (à vérifier, pour moi le compilo voi : A.operator=(A)) il va alors chercher à trouver la méthode B::operator=(A); si celle-ci n'est pas défini il va chercher dans la classe mère, à savoir A, A::operator=(A), qu'il va trouver.
D'un autre coté, comme tu ne mets pas le code source, je ne fait que des hypothèses.
Met au moins la déclaration des classes.
D'un autre coté, je ne comprends pas pourquoi tu met du B dans du A. autant mettre du B dans du B. La démarche se comprends si tu fait :
A** objet=new A*[N];
objet[0]=new B;
objet[1]=new A;
c'est à dire si tu utilise le polymorphisme. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur