IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

problème au surcharge d'opérateur =


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Par défaut problème au surcharge d'opérateur =
    Bonjour,
    j'ai une structure comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    class P
    public:
    	char* DataFile;
    	int nbter;
    	int nbser;
    	int nbf;
    	int nbgp;
    	vector<S *> ser;
    	vector<F *> f;
    	vector<T *> ter;
    	vector<G *> grp;
    	Cellule* cell;
    public:
    	P(char* df);
    	P(const Pe& p);
    	Properator=(const P &p);
    	virtual ~P();
     
    };
    Et j'ai défini l'opérateur= comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    P P::operator=(const P &p)
    {
    	     nbter=p.nbter;
    		nbsers=p.nbser;
    		nbf=p.nbf;
    		nbgp=p.nbgp;
    		cell=p.cell;
    	    ser.reserve(p.ser.size()); // optimize insertion
    	    ter.reserve(p.ter.size());
    	    grp.reserve(p.grp.size());
    	    f.reserve(p.f.size());
     
    	for (vector<S *>::const_iterator its = p.ser.begin();its != p.ser.end();its++)
    	 ser.push_back(new S(**its));
    	for (vector<F *>::const_iterator itf = p.f.begin();itf != p.f.end();itf++)
    	    f.push_back(new F(**itf));
    	.
            .
            .
        return *this;
    }
    Mais quand je declare 2 objet de type P: P a,b;
    je modifie a, après a=b; l'affectation ca se produit pas a reste différente de b
    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    P P::operator=(const P &p)
    {
    	     nbter=p.nbter;
    		nbsers=p.nbser;
    		nbf=p.nbf;
    		nbgp=p.nbgp;
    		//cell=p.cell;  //lol ,mark 
                             cell = new Cellule(*p.cell);
     
    	    ser.reserve(p.ser.size()); // optimize insertion
    	    ter.reserve(p.ter.size());
    	    grp.reserve(p.grp.size());
    	    f.reserve(p.f.size());
     
    	for (vector<S *>::const_iterator its = p.ser.begin();its != p.ser.end();its++)
    	 ser.push_back(new S(*its));//mark
    	for (vector<F *>::const_iterator itf = p.f.begin();itf != p.f.end();itf++)
    	    f.push_back(new F(*itf));//mark
    	.
            .
            .
       ///aussi pour DataFile....
        return *this;
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Comment savez-vous que a et b sont différents ?
    il faudrait aussi surcharger l'opérateur ==

  4. #4
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    Il faudrait d'abord vider les vecteurs de l'objet destination avant de faire les push_back() et du coup vérifier qu'on ne fait pas une autoaffectation (a=a) car dans ce cas on perd tout.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Par défaut
    j'affiche leur contenu et je vois qu'ils ont le même contenu

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    et comment affiche-tu tes classes ?

    ça n'a rien d'évident à priori.

    D'autre part, vu ta métode de copie, les obets ne seront pas égaux puisque ter et grp ne sont pas alloué.

    de plus, tu fais une copie avec des vecteurs de pointeurs donc les pointeurs finaux seront différents...

    bref. Il faudrait nous dire qu'est-ce qui est différent et ne devrait pas l'être ainsi que comment tu constate cette différence .

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Par défaut
    Au debut je charge ma structure de type P par un fichier dans le constructeur.
    maintenant a de type P est rempli, quand je fais par exemple a=b. b est bien a le meme contenu que a.
    J'affiche par exemple un element de 2 objet a et b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cout<<a.ser.at(1)->nbt<<"\n";
    			           cout<<b.ser.at(1)->nbt<<"\n";
    j'aurai :
    2
    2
    Je modifie l'objet a par J'affiche les 2 objet jusqu'à maintenant c'est bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cout<<a.ser.at(1)->nbt<<"\n";
    			           cout<<b.ser.at(1)->nbt<<"\n";
    J'aurai :
    5
    2
    Après je fais l'affectation a=b;
    J'affiche a et b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cout<<a.ser.at(1)->nbt<<"\n";
    			           cout<<b.ser.at(1)->nbt<<"\n";
    j'obtiens
    5
    2
    par contre moi je veux
    2
    2
    car j'ai affecté le contenu de a à b
    merci à vous tous et j'éspère que je suis claire cette fois

  8. #8
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    je dois avouer que j'ai un peu de mal à comprendre comment ton compilo laisse passer ça, à moins que tu ne définisse un constructeur de S à partir d'un pointeur et dans ce cas, l'erreur vient du constructeur de S : en effet, si on regarde ton programme:

    tu alloue la variable ser comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (vector<S *>::const_iterator its = p.ser.begin();its != p.ser.end();its++)
    	 ser.push_back(new S(*its));//mark
    ici, its est un itérateur de S* . On peut donc considérer ça comme un S** donc *its est un S* donc tu construit bien tes S à partir de S*. Deux solutions: ou tu n'a pas de constructeur à partir S* et là, je ne sais pas si ton compilo t'en fabrique un, ou , si tu en a un, alors, celui ci doit probablement se contenter de recopier le pointeur.

    Jespère avoir été clair. Dans le cas contraire, il me faut la déclaration de S pour être plus clair.

    Bonne chance.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Par défaut
    voila la déclaration de S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class S {
    public:
    	string id;
    	vector<T*> ter;
    	int nbt;
    	vector<F *> fl;
    	int nbfl;
    	int nbgr;
    	vector<G *> grp;
    	int num;
    	double RisqueInter;
    public:
    	S(char* i,int n);
    	virtual ~S();
     
    	void addTer(T*);
    	void addFl(F *);
    	void addGrp(G *);
    	friend ostream& operator<<(ostream&, const S& );
    };
    Merci encore une fois de votre rèponse

  10. #10
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par zougagh Voir le message
    voila la déclaration de S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class S {
    public:
    	string id;
    	vector<T*> ter;
    	int nbt;
    	vector<F *> fl;
    	int nbfl;
    	int nbgr;
    	vector<G *> grp;
    	int num;
    	double RisqueInter;
    public:
    	S(char* i,int n);
    	virtual ~S();
     
    	void addTer(T*);
    	void addFl(F *);
    	void addGrp(G *);
    	friend ostream& operator<<(ostream&, const S& );
    };
    Merci encore une fois de votre rèponse
    Merci d'ajouter les balises code (bouton #) pour plus de lisibilité.


    Sinon, il semble que ton compilateur interprète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            ser.push_back(new S(*its));//mark
    commme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            ser.push_back(new S*(*its));//mark
    il faut dire qu'il n'y a pas vraiment de méthode définie

    tu a deux solutions:
    • ou tu définis un constructeur de copie pour S c'est à dire S(const S &)
    • ou tu laisse le contructeur par défaut, mais là, les copies de tableau pointeurs se feront sans réallocation.


    Dans les deux cas, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            ser.push_back(new S(*its));//mark
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            ser.push_back(new S(**its));//mark
    ce qui te permettra de construire S à partir d'un S et non d'un S*.

    Bonne chance

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Par défaut
    merci
    Mais toujours même problème

  12. #12
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par zougagh Voir le message
    merci
    Mais toujours même problème
    tu a fais la modification ? Quel est ton code ? le compilateur t'affiche-t'il des warning ? Serait-il possible de VRAIMENT avoir le moceau de code qui te sert de test ?

    Merci.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Par défaut
    ok ,j'ai réussi à résoudre le problème mais après une boucle d'affectation a=b et b=a j'obtiens nan sur la valeurs que je veux afficher sinon ya pas warning tous va bien .
    Merci mille fois

Discussions similaires

  1. Problème de surcharge d'opérateur flux avec pointeur
    Par eleve_prog dans le forum Débuter
    Réponses: 4
    Dernier message: 18/04/2011, 18h41
  2. Problème de surcharge d'opérateur std::cout
    Par Nyko17 dans le forum C++
    Réponses: 14
    Dernier message: 28/04/2008, 13h01
  3. Réponses: 7
    Dernier message: 02/12/2007, 21h43
  4. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  5. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo