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

Visual C++ Discussion :

[débutant] surcharge d'opérateur


Sujet :

Visual C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Par d�faut [débutant] surcharge d'opérateur
    Bonjour,
    je souhaite surcharger l'op�rateur "= " pour pouvoir faire une affectation entre deux objets de ma classe CParam.

    voici le code de ma classe :

    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
     
    class CParam  
    {
    public:
    	CParam();
    	CParam(CString Name,CString Value,CString* Validation);
    	virtual ~CParam();
    	// Redéfinition de l'opérateur d'affectation
    	CParam & operator=(const CParam & e);
     
    public:
    	CString m_strValue;
    	CString* m_strValidation;
    	CString m_strName;
    };
    voici le code de ma surcharge

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Définition de l'opérateur d'affectation
    CParam & CParam::operator=(const CParam & e) 
    {
    	m_strName = e.m_strName;
    	m_strValidation = e.m_strValidation;
    	m_strValue = e.m_strValue;
     
      return *this; // On retourne une référence sur l'objet courant
    }
    � l'ex�, je me retrouve avec cette erreur : Unhandled exception , access violation au moment de l'affectation de je ne comprends pas du tout pourquoi...
    quelqu'un pourrait il m'aider?
    merci...

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Je ne sais pas non plus, mais cette ligne-ci me fait peur:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    m_strValidation = e.m_strValidation;
    Ici, tu dupliques un pointeur, et non l'objet CString... Je ne connais pas le code de ton destructeur, mais j'esp�re que tu ne fais pas de delete dessus...


    PS: Pour ton erreur, l'access violation peut aussi venir d'autre chose qui se serait pass� avant la copie...
    V�rifie aussi que tu ne passes pas une r�f�rence nulle (oui, �a peut arriver) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    CParam *pParam = NULL;
    CParam par;
    par = *pParam; //Crash!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    je pense que ton probleme est plutot sur l'affectation de
    m_strValidation qui est declar�e en tant que pointeur dans ta classe.
    sachant que tu vas copier l'adresse et non le contenu, lors de la destruction d'un de tes objets CParam un de tes objets m_strValidation pointera sur une adresse invalide (si tu l'a lib�r� dans le destructeur) provoquant ainsi une assertion d'erreur � l'utilisation...
    ton affectation dans l'operateur pour cette variable est incorecte...
    de plus tu devrais rajouter:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    if(this==&e) return *this;
    pour finir je ne vois l'interet de d�clarer une CString sous forme de pointeur dans une classe ....

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Par d�faut
    non mon destructeur est vide... je ne le lib�re nulle part.
    et puis, c'est vraiment lors de cette affectation que ca plante (m_strName = e.m_strName; ), si j'en crois mon debbuger...
    De plus, si j'enl�ve le pointeur m_strValidation (qui ne me sert pas dans l'imm�diat), j'ai toujours le m�me soucis :

    Param.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
     
    class CParam  
    {
    public:
    	CParam();
    	CParam(CString Name,CString Value);
    	virtual ~CParam();
    	// Redéfinition de l'opérateur d'affectation
    	CParam & operator=(const CParam & e);
     
    public:
    	CString m_strValue;
    	CString m_strName;
    };
    Param.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
     
    CParam::CParam()
    {
    	m_strName = "Name";
    	m_strValue="Value";
    }
     
    CParam::CParam(CString Name,CString Value)
    {
    	m_strName = Name;
    	m_strValue=Value;
    }
     
    CParam::~CParam()
    {
    }
     
    // Définition de l'opérateur d'affectation
    CParam & CParam::operator=(const CParam & e) 
    {
    	m_strName = e.m_strName;
    	m_strValue = e.m_strValue;
     
    	return *this;
    }
    De plus, Farscape, si j'ajoute ce que tu me recommande :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    if(this==&e) return *this;
    j'ai l'erreur en compil qui me dit qu'il est poussible que la fonction ne retourne rien. et je ne sais pas quoi mettre dans le else...

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tu ne dois pas toucher au return actuel: Il fallait juste que tu ajoutes cette ligne en t�te de fonction.

    Mais je r�it�re mon conseil, sous une autre forme: Rajoute en plus:
    Si tu es en MFC, tu peux essayer ATLASSERT(), puis ASSERT() si <assert.h> ou <cassert> n'est pas inclus de base.
    Si tu compiles sans MFC, ajoute le header standard <cassert>.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    R�ponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    R�ponses: 3
    Dernier message: 18/05/2009, 16h12
  3. R�ponses: 2
    Dernier message: 05/10/2004, 22h43

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