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 :

Probleme de surcharge operateur +


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut Probleme de surcharge operateur +
    Chères amies, chers amis du forum

    J'ai créer une classe Abstraite var_alea:
    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
    26
    27
    28
    29
    30
    31
    32
    33
     
     
    #ifndef __VAR_ALEA_H_
    #define __VAR_ALEA_H_
     
    #include <cmath>
    #include <ctime>
    #include <cmath>     
    #include <ctime>
    #include <cstdlib>
    #include <numeric>
    #include <cstring>
     
    #define MAX(A,B) ( (A) > (B) ? (A):(B) )
    #define MIN(A,B) ( (A) < (B) ? (A):(B) )
     
    #define PI 3.14159265358979
    #define DEUXPI 6.283185306
    #define PI2 1.570796326794
     
    class var_alea
    {
    public:
     
        var_alea() {};
        virtual ~var_alea() {}; 
        virtual double operator()() = 0;
     
    protected: 
     
     
    };
    #endif
    et une classe Gauss

    Gauss.h
    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
     
    #ifndef GAUSS_H
    #define GAUSS_H
     
    #include "var_alea.h"
    #include "Uniform.h"
     
    class Gauss : public var_alea {
     
    public :
    		Gauss (double moy=0, double sigmadeux=1) : m_moy(moy), m_sigmadeux(sigmadeux)
    			{
    			}
    		Gauss (const Gauss &);
    		double operator ()();
    		Gauss & operator =(const Gauss &);
    		friend Gauss operator +(const Gauss &, const Gauss &);
     
    private :
     
    		double m_moy, m_sigmadeux ;
     };
     
    #endif
    Gauss.cpp

    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
    26
    27
    28
    29
    30
    31
     
    #include "Gauss.h"
     
    double Gauss::operator()() 
    	{
    		Uniform U1, U2;
    		double  V1, V2;
    		double  S = 2;
    		while (S>=1) 
    		{
    			V1 = U1();
    			V2 = U2();
    			V1 = 2.0*(V1 + 0.00001)-1.0;
    			V2 = 2.0*(V2 + 0.00001)-1.0;
    			S  = V1*V1 + V2*V2;
    		};
        return (m_moy + m_sigmadeux*(V1*sqrt((-2.0*log(S))/S)));
     
        };
     
    Gauss & Gauss::operator=(const Gauss &n)
    {
    	m_moy = n.m_moy;
    	m_sigmadeux = n.m_sigmadeux;
    	return *this;
    }
    Gauss operator+ (const Gauss &n,const Gauss &m)
    {
    	Gauss  p (n.m_moy + m.m_moy,n.m_sigmadeux + m.m_sigmadeux);
    	return p;
    }
    main.cpp
    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
     
     
    #include "Uniform.h"
    #include "Poisson.h"
    #include "Gauss.h"
    #include <iostream>
     
    int main()
    {	
    	srand(time(0));
     
    	Gauss G;
     
    	return 0;
     
    };

    La surcharge de l'operateur + pose probleme et voici le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Gauss.cpp
    1>Gauss.obj : error LNK2019: symbole externe non résolu "public: __thiscall Gauss::Gauss(class Gauss const &)" (??0Gauss@@QAE@ABV0@@Z) référencé dans la fonction "class Gauss __cdecl operator+(class Gauss const &,class Gauss const &)" (??H@YA?AVGauss@@ABV0@0@Z)
    \Projet.exe : fatal error LNK1120: 1 externes non résolus
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    Pourriez vous m'aider SVP?

    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,
    Remplace dans 'Gauss.cpp' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Gauss operator+ (const Gauss &n,const Gauss &m)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Gauss Gauss::operator+ (const Gauss &n,const Gauss &m)
    C'est la faute d'étourdissement de base!!!

  3. #3
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Merci

    Cela ne marche pas c'est une fonction friend

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il manque l'implémentation du constructeur par copie (ce que dit l'erreur en fait).

    MAT.

  5. #5
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Merci beaucoup

    cela marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Gauss::Gauss(const Gauss &n)
    {
    	m_moy = n.m_moy;
    	m_sigmadeux = n.m_sigmadeux;
    }

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    D'ailleurs, vu que les membres de ta classe Gauss ne sont que des types basique (double m_moy, m_sigmadeux) tu peux supprimer complètement ton constructeur par copie du .h et ton opérateurs d'affectation (operator=) de .h et du .cpp : Le compilateur généra alors automatiquement un constructeur par copie et un opérateur = corrects, qui font de la copie membre à membre.

  7. #7
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Pourquoi ne pas faire 'operateur +' en fonction membre?

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par bertry Voir le message
    Pourquoi ne pas faire 'operateur +' en fonction membre?
    Parce que généralement, on fait += en fonction membre, et + en fonction libre (en se servant de += comme ça on a même pas besoin qu'elle soit friend).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Type operator+(const Type& a, const Type& b)
    {
      return Type(a).operator+=(b);
    }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Probleme de surcharge d'operateur
    Par wawa84 dans le forum C++
    Réponses: 2
    Dernier message: 19/10/2008, 20h52
  2. [debutant]probleme avec l'operateur +
    Par Battosaiii dans le forum Débuter
    Réponses: 9
    Dernier message: 17/11/2005, 01h29
  3. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 12h20
  4. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51
  5. surcharge operateur && pointeurs
    Par le y@m's dans le forum C++
    Réponses: 6
    Dernier message: 10/05/2005, 15h57

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