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
    Nouveau 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
    Points : 1
    Points
    1
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 57
    Points
    57
    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
    Nouveau 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
    Points : 1
    Points
    1
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 57
    Points
    57
    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 émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Points : 57
    Points
    57
    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 : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    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
    Points : 13 017
    Points
    13 017
    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