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 �m�rite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    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 confirm�
    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
    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;
    }

  3. #3
    Membre �m�rite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    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 exp�riment�
    Avatar de Djob
    Inscrit en
    Ao�t 2002
    Messages
    215
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 215
    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

    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 �m�rite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    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 exp�riment�
    Avatar de Djob
    Inscrit en
    Ao�t 2002
    Messages
    215
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 215
    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