begin process at 2012 05 28 09:10:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Argh! Problème de constructeur de recopie et de surdéfinition de =


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Argh! Problème de constructeur de recopie et de surdéfinition de =

mercredi 16 novembre 2005 à 11:12:52 | Argh! Problème de constructeur de recopie et de surdéfinition de =

le_duche

Membre Club
Ca fait une semaine que j'eesaye de comprendre ce bug, mais rien n'y fait
(et je me sent tout frustré du coup , je dors plus, je mange plus, je bois plus ('fin non quand même pas...))

A la base, je fais une classe sur les matrices, mais je ne vais pas vous fournir celle-là car ce serait bien long...
Mais j'ai fait (spécialement pour vous ) une autre classe, qui fonctionne sur le même principe et qui a le meme problème de compilation...

Voici la classe buguée:



class A
{
    int a;
public:
    A()
    {
        a=0;
    }
    int get_value()
    {
        return a;
    }
    void set_value(int new_a)
    {
        a=new_a;
    }
    A operator+(A& other)
    {
        A sum;
        sum.set_value(this->get_value() + other.get_value());
        return sum;
    }
    A& operator=(A& other)
    {
        this->set_value(other.get_value());
        return *this;
    }
};


Immaginons que mon main() soit

int main()
{
    A a,b,c;
    a.set_value(1);
    b.set_value(36);
    c.set_value(42);
    a = b+c;
    return 0;   
}

Alors il ne compile pas la ligne en rouge, et me dit:
Error: no match for 'operator=' in 'a = A::operator+(A&)((&c))
Error: Candidates are: A& A::operator=(A&)

Je comprend pas trop ce qu'il me veut , mais il est pas content le compilo !


Alors j'ai pensé faire ceci:

class A
{
    int a;
    bool tampon;
public:
    A()
    {
        a=0;
        tampon = false;
    }
    int get_value()
    {
        return a;
    }
    void set_value(int new_a)
    {
        a=new_a;
    }
    A& operator+(A& other)
    {
        A* sum = new A;
        sum->tampon = true;
        sum->set_value(this->get_value() + other.get_value());
        return *sum;
    }
    A& operator=(A& other)
    {
        this->set_value(other.get_value());
        if(other.tampon)
        delete &other;
        return *this;
    }
};



Mais malgré ma courte expérience en programmation, ca me semble assez laid, on dirait du bricolage. Et en plus si un gugus d'utilisateur (en l'occurence moi ) s'amuse à écrire:
A a,b;
a.set_value(1);
b.set_value(2);
while(1)
{
    a+b;
}
La mémoire explose, car la matrice de résultat de a+b n'est pas détruite.


On m'a aussi proposé ceci, mais qui comporte le même problème de mémoire...

class TemporaryA;

class A
{   
    int a;
public:
    A();
    int get_value();
    void set_value(int new_a);
    TemporaryA& operator+(A& other);
    A& operator=(A& other);
    A& operator=(TemporaryA& other);
};

class TemporaryA : public A {};

A::A(){ a=0; }

int A::get_value(){ return a; }

void A::set_value(int new_a) { a=new_a; }

TemporaryA& A::operator+(A& other) {
    TemporaryA* sum = new TemporaryA;
    sum->set_value(this->get_value() + other.get_value());
    return *sum;
}

A& A::operator=(A& other) {
    this->set_value(other.get_value());
    return *this;
}

A& A::operator=(TemporaryA& other) {
    this->set_value(other.get_value());
    delete &other;
    return *this;
}

C'est un peu plus beau que ce que j'ai fait plus haut, mais c'est toujours aussi foireux pour la mémoire...

J'ai comme on dit "besoin d'un p'tit coup d'pouce"

ps:
Je suis obligé de surdéfinir les constructeurs car mon vrai projet est avec des matrices dynamiques...
Ne me dites pas de changer de language pour faire ca, je sais bien que le c++ n'est pas top pour les math, mais c'est pour un projet officiel en c++, donc je n'ai pas ce choix...
C'est pas méga urgent mais je dois quand même le rendre en janvier, et j'ai pas mal de boulot à côté...


MERCI BEAUCOUP !!!


Duchon.

mercredi 16 novembre 2005 à 11:20:17 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

buno

Administrateur CodeS-SourceS
Réponse acceptée !

Hello,
l'opérateur "+" se surcharge comme suit:

operator+(A& other1, A& other2);

Ce que tu as fait est pour l'opérateur "+="...


Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

mercredi 16 novembre 2005 à 11:22:46 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

le_duche

Membre Club
Réponse acceptée !


Dans le cas de mes matrices, en friend alors ?
J'essayerai ce soir...
merci !


Duchon.

mercredi 16 novembre 2005 à 11:32:05 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

buno

Administrateur CodeS-SourceS
Effectivement, j'ai oublié de préciser "friend" mais tu as corrigé tout seul...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
mercredi 16 novembre 2005 à 12:11:01 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

Aquarian

Salut,

On peut régler le problème différemment, il suffit juste de rajouter les "const" qui manquent dans ton code sinon l'entête pour l'opérateur + peut bien être écrit comme tu l'as fait. Il compile chez moi avec les const rajoutés :

class A
{
    int a;
public:
    A() {
        a=0;
    }
   
    int get_value() const {
        return a;
    }
   
    void set_value(int new_a) {
        a=new_a;
    }

    A operator+(const A& other) const{
        A sum;
        sum.set_value(this->get_value() + other.get_value());
        return sum;
    }

    A& operator=(const A& other)
    {
        this->set_value(other.get_value());
        return *this;
    }
};

De cette façon on évite les opérateur friend :)

A bientôt

_________
Aquarian

mercredi 16 novembre 2005 à 13:05:50 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

luhtor

Non, normalement l'opérateur + ca doit etre un friend, et pas une fonction membre.


mercredi 16 novembre 2005 à 15:31:59 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

Aquarian

Ca ne doit pas être obligatoirement un friend...
Les deux s'utilisent, je ne pense pas qu'une méthode soit meilleure par rapport à l'autre mais peut-être qu'il y a une raison telle qu'utiliser un friend dans ce cas serait préférable.

_________
Aquarian
mercredi 16 novembre 2005 à 16:16:10 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

le_duche

Membre Club

Vous battez pas !
Je vais reagarder ca tranquillement ce soir (pas le net chez moi...) et je vous dirai demain si je m'en suis sorti

Merci beaucoup en tous cas !

Duchon.

mercredi 16 novembre 2005 à 16:44:04 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

Aquarian

Mais non, ma réponse est peut-être un peu sèche mais ce n'était pas voulu :(
En fait j'aimerai savoir comment l'un des deux choix peut-être justifié suivant les cas.
_________
Aquarian
mercredi 16 novembre 2005 à 17:17:08 | Re : Argh! Problème de constructeur de recopie et de surdéfinition de =

buno

Administrateur CodeS-SourceS
sans friend --> surcharge d'opérateurs internes à la classe (+=,-=,...)
avec friend --> surcharge d'opérateurs externes (+, -, ...)

A priori, la déclaration des opérateurs avec friend permettrait à ces derniers de manipuler les données membres de leurs opérandes...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

1 2

Cette discussion est classée dans : set, get, value, operator, other


Répondre à ce message

Sujets en rapport avec ce message

Set/Get WT sur resource :) [ par wxccxw ] Comment faire un GetWindowText et SetWindowText Sur une Resource IDD_DIALOG1 et ses bouton ? Merci d'avance :) cin besoin aide [ par Chubab ] voila je suis en train de créer un programme qui donne les probabilités au hold'em poker...kan jutilise cin pour une variable char il ne prend que le problème avec la librairie gmp de VC++ 6.0 sous windows [ par othland ] voila ce que j'ai fait: --------------------------- libgmp-3.dll>>>>>dans c:\windows\system32 gmp.h, mpf2mpfr.h, mpfr-impl.h, mpfr.h>>>>>dans c:\progr Alignement de données [ par julienbj ] Cela fait maintenant plusieurs fois que je lis des commentaires sur l'alignement des données dans les structures. Apres quelques recherches sur le suj URGENT: Répondre au requêtes GET & GETNEXT à partir de visual C++ [ par lou1978 ] Salut tout le monde,Comment puis-je programmer via Visual C++ un module qui répondera aux requêtes GET et GETNEXT recues?Gracias Passage de tableau d'objets entre différentes classes [ par berenger_R ] Bjr, J'ai un probleme avec un petit programme pour tester (c pour ca qu'il y a bcp de cout) certaine fonctionalité dont g besoin pour un programme bcp Problème serveur TCP en C [ par lenneth666 ] BOnjour j'ai un petit problème. Je voulais faire en sorte que mon serveur puisse gérer la réception et l'envoi de message en parralèle, mais celà ne Probleme avec "strcat" [ par PierreKill ] Bonjour.Je fais actuellement un programme qui recense des resultats obtenus sur internet.Je vous explique : il s'agit d'un programme pour lequel on pe Opérateur de comparaison dans une classe générique [ par benjiiim94 ] Bonjour, Je crois que pas mal d'infos sont dans le titre, il ne manque plus que la source de la classe : #pragma once #include "StdAfx.h" using n bis:download d'un fichier http [ par fredleconte ] Bon j'ai ouvert une socket connecte a un serveur web ( ici www.wanadoo.fr port 80) je fais un 'GET index.html' mais je ne recois rien ( je ne connais


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales