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 :

Operator= entre deux class


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Par d�faut Operator= entre deux class
    Bonjour,

    Je suis sur un projet ou j'ai actuellement besoin de faire une class "A"
    Et je doit d�clarer la class "B" de la fa�on suivante :

    MaClassA A(nom_de_ma_class)
    MaClassB B = A

    Petit probl�me :
    Pas de compilation, une erreur :
    conversion from �A� to non-scalar type �B� requested

    Merci,
    En attente de vos r�ponses .

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par d�faut
    Si tu d�clare ta classe comme cela:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    MaClassA a(...);
    MaClassB b = a;
    Ce n'est pas l�op�rateur '=' mais le constructeur par copie qui est appeler il me semble.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Par d�faut
    Citation Envoy� par Vodsky Voir le message
    Si tu d�clare ta classe comme cela:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    MaClassA a(...);
    MaClassB b = a;
    Ce n'est pas l�op�rateur '=' mais le constructeur par copie qui est appeler il me semble.
    Je sais c'est une construction par copie que je fait, j'ai ma fonction :

    B& B::operator=(const A& other)
    {
    if(&other != this)
    {
    this->_name = other._name;
    }
    return *this;
    }

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par d�faut
    Si tu tien r�ellement a d�clarer ta classe comme �a
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    MaClassA a(...);
    MaClassB b = a;
    Il va falloir que tes classes MaClassA et MaClassB aient une relation d�h�ritage sinon sa sera pas possible (� moins de coller un reinterpret_cast<> bien moche et encore c'est pas sure que sa marche...).

    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
     
    class B
    {
        //...
    };
     
    class A : public B
    {
        //...
    };
     
    int main()
    {
        A a;
        B b = a;
     
        //...
        return 0;
    }

  5. #5
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par d�faut
    Citation Envoy� par agv13 Voir le message
    Je sais c'est une construction par copie que je fait, j'ai ma fonction :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    B& operator=(const A& other)
    {
    if(&other != this)
    {
    this->_name = other._name;
    }
    return *this;
    }
    Non, ce n'est pas un constructeur que tu as fait l�, mais un op�rateur d'affectation.
    Un constructeur ce serait �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     B(const A& other)
    {
     //...
    }
    Le constructeur est appel� lors de la construction de l'objet, c'est � dire pour cr�er un objet qui n'existe pas encore, alors que l'op�rateur = d'affectation est appel� lors de l'affectation d'une nouvelle valeur � un objet existant.
    Donc :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    A a; //constructeur par défaut de A
    B b = a; // appel du constructeur B(const A& other)
    b = a; // appel de l'opérateur d'affectation B& operator=(const A& other)
    Edit : Et pas besoin de relation d'h�ritage ou de reinterpret_cast zarb, Vodsky

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par d�faut
    Moi et ma folie des grandeurs

    Autant pour moi, j'avais oubli�.

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Citation Envoy� par agv13 Voir le message
    Bonjour,

    Je suis sur un projet ou j'ai actuellement besoin de faire une class "A"
    Et je doit d�clarer la class "B" de la fa�on suivante :

    MaClassA A(nom_de_ma_class)
    MaClassB B = A

    Petit probl�me :
    Pas de compilation, une erreur :
    conversion from �A� to non-scalar type �B� requested

    Merci,
    En attente de vos r�ponses .
    Bonjour

    D'un point de vue stricte, le constructeur B::B(A const&) n'est pas un constructeur par copie et l'op�rateur B& B::operator=(A const&) n'est pas l'op�rateur d'affectation. Ces noms (� ma connaissance) sont r�serv�s dans le cas d'une classe sur elle m�me.

    Le constructeur B::B(A const&) sans mot cl� explicit est appel� constructeur de conversion. Il n'est pas n�cessaire de cr�er aussi l'op�rateur B& B::operator=(A const&) puisque sans le mot cl� explicit, le compilateur convertira automatiquement B b = a; en B b(a); (donc en appelant le constructeur de conversion).

    Pour rappel, il est d'usage de mettre le mot cl� explicit devant tous les constructeurs prenant 1 param�tre sauf volont� d'avoir une conversion implicite. Mais il faut pour cela que �a un sens au niveau s�mantique (par exemple pour convertir un entier en r�el ou un r�el en complexe ; utiliser la conversion implicite pour convertir un type dans un autre type juste parce que ce second type utilise des param�tres du premier type n'est pas tr�s clean)

    Donc en conclusion, tu n'as besoin que de d�clarer le constructeur de conversion.

  8. #8
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Ce qui donne concr�tement :
    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
    #include <iostream>
    #include <string>
     
    class A
    {
    public:
       explicit A(std::string const&){}
    };
     
    class B
    {
    public:
       B(A const&){}
    };
     
    int main()
    {
       A a("tutu");
       B b = a;
       return 0;
    }
    En lisant le post de base, j'ai eu un petit doute :
    MaClassA A(nom_de_ma_class)
    Ce n'est pas �a A a(A); ? Car �a ne d�finit pas un A mais une fonction qui prend un A et en retourne un (cf F.A.Q.).

Discussions similaires

  1. R�ponses: 12
    Dernier message: 19/04/2008, 16h19
  2. [POO] H�ritage entre deux classes
    Par Lenaick dans le forum Langage
    R�ponses: 5
    Dernier message: 16/10/2007, 09h53
  3. Association entre deux classes en dotnet
    Par lulu3111 dans le forum C++/CLI
    R�ponses: 4
    Dernier message: 18/04/2007, 21h15
  4. Passage d'un objet entre deux classes
    Par ericlemoustic dans le forum Langage
    R�ponses: 2
    Dernier message: 13/10/2006, 09h58
  5. R�ponses: 5
    Dernier message: 17/08/2005, 12h40

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