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++Builder Discussion :

[Pb de débutant, et encore] surcharge operator = [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut [Pb de débutant, et encore] surcharge operator =
    Je suis confronté à un problème qui me laisse perplexe: J'ai une classe MaClasse que je peux évidemment copier très classiquement avec un =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      TMaClasse MaClasse1;
      TMaClasse MaClasse2;
     
      MaClasse1.X = 1;
      MaClasse1.Y = 2;
     
      MaClasse2 = MaClasse1;
    J'ai surchargé l'opérateur = pour pouvoir l'initialiser avec une structure. Pour moi, le prototype étant différent, ça devrait juste être une méthode polymorphe et ne pas affecter l'opérateur = par défaut:

    le .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
    //---------------------------------------------------------------------------
    typedef struct
    {
      short x;
      short y;
    } MASTRUCTURE;
    //---------------------------------------------------------------------------
    class TMaClasse
    {
    private:
      int FX;
      int FY;
    public:
      __fastcall TMaClasse(void);
      __property int X = {read = FX, write = FX};
      __property int Y = {read = FY, write = FY};
     
      const TMaClasse &operator = (const MASTRUCTURE &MaStructure);
    };
    //---------------------------------------------------------------------------
    le .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
    //---------------------------------------------------------------------------
    __fastcall TMaClasse::TMaClasse()
    {
      FX = 0;
      FY = 0;
    }
    //---------------------------------------------------------------------------
    const TMaClasse &TMaClasse::operator = (const MASTRUCTURE &MaStructure)
    {
      FX = MaStructure.x;
      FY = MaStructure.y;
     
      return *this;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TMaClasse MaClasse1;
      TMaClasse MaClasse2;
     
      MaClasse1.X = 1;
      MaClasse1.Y = 2;
     
      MaClasse2 = MaClasse1; // <- Erreur 
     
      MASTRUCTURE MaStructure;
      MaStructure.x = 3;
      MaStructure.y = 4;
      MaClasse2 = MaStructure;
    }
    Dans ce cas, j'ai une erreur E2328 les classes avec des propriétés ne peuvent pas être copiées par valeur que je ne comprends pas. Faut-il dans ce cas que je redéfinisse aussi l'opérateur = par défaut ? Pourquoi le fait de redéfinir le = avec un prototype différent affecte le = par défaut ?

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu dois définir explicitement un opérateur = pour ta TMaClasse. L'opérateur par défaut ne peut opérer sur des classes avec propriétés
    //---------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const TMaClasse &TMaClasse::operator = (const TMaClasse &MaClasse)
    {
      FX = MaClasse.FX;
      FY = MaClasse.FY;
      return *this;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par diogene
    L'opérateur par défaut ne peut opérer sur des classes avec propriétés
    Ben non, puisque dans le premier cas, ça marche très bien (propriétés comprises).

    Citation Envoyé par diogene
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const TMaClasse &TMaClasse::operator = (const TMaClasse &MaClasse) 
    { 
      FX = MaClasse.FX; 
      FY = MaClasse.FY; 
      return *this; 
    }
    Oui, bien sûr, j'ai bien pensé à faire ça. Seul problème, c'est que j'ai un certain nombre de classes avec plusieurs dizaines de propriétés chacune. Si j'avais pu éviter cette solution, ça m'arrangerais.

  4. #4
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    le probleme est que l'operateur égal fait partie de ceux que j'appelle les "4 operateurs maudits (), [], -> et = "
    que tu n'as pas le droit de déclarer comme amis de la classe ,
    ce que l'on fait généralement quand il s'agit de type différents...

    pourquoi ne pas envisager le probleme d'une manière différente pour l'affection de ta structure :

    Au lieu d'autoriser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MaClasse = MaStructure;
    pourquoi ne pas obliger l'utilisateur à utiliser un constructeur par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse = MaClasse(MaStructure);

  5. #5
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Djob
    pourquoi ne pas obliger l'utilisateur à utiliser un constructeur
    Parce que c'est pas forcément au moment de sa construction qu'on veut affecter des valeurs à une classe.

    Je pourrais également faire une méthode (c'est sans doute ce que je vais faire), mais:

    1) Le code sera moins clair, et il n'avait réellement pas besoin de ça pour être déjà incompréhensible.

    2) J'aurais pas compris pourquoi ça marche dans un cas et pas dans l'autre, et j'aime pas ne pas comprendre.

  6. #6
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    j'ai revérifié en c++ standard ,cette façon de faire passe sans probleme donc tu as raison.

    Par contre j'ai l'impression que le probleme se situe au niveau de l'emploi de __property

    lors de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse2 = MaClasse1; // <- Erreur
    toutes les propriétés VCL semble ne pas être acceptée par le compilateur
    quand l'opérateur = entre TMaClasse et MASTRUCTURE est défini...

    si on enleve les __property du code , la compilation se fait normalement.

    il faudrait pouvoir savoir comment fonctionnne en détail le mecanisme de __property .

Discussions similaires

  1. Réponses: 16
    Dernier message: 21/05/2007, 01h04
  2. problème surcharge operator+ (UNIX)
    Par richard_sraing dans le forum Linux
    Réponses: 9
    Dernier message: 01/12/2006, 20h41
  3. Débutant, problème de surcharge
    Par guidevelop dans le forum C++
    Réponses: 5
    Dernier message: 06/11/2006, 14h28
  4. Namespace et surcharge operator new/delete
    Par ZeLegolas dans le forum C++
    Réponses: 11
    Dernier message: 26/07/2005, 13h55
  5. Réponses: 2
    Dernier message: 25/07/2004, 23h24

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