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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_strName = e.m_strName;
    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 395
    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 395
    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 395
    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 395
    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