Convesion de type et constructeur de conversion avec std::string

Le problème exposé dans ce sujet a été résolu.

Salut à tous :)

Pour mon apprentissage, je fais quelques petits tests par curiosité. Actuellement, je me retrouve avec un comportement du constructeur de conversion que je n’arrive pas à expliquer. Le bout de code est le suivant :

#include <iostream>
#include <string>

class joueur {
 public :
     joueur(std::string);
     std::string _nom;
};

joueur::joueur(std::string n ): _nom(n) {
std::cout << "In Constructor: nom = " << _nom << std::endl;}

class complexe {
  int reel;
  int imag;

  public:
  complexe(int a, int b) : reel(a), imag(b) {}
  /*explicit*/ complexe(int a) : reel(a), imag(0) {}
  void affiche () {std::cout << "[ "<< reel<< " " << imag << "]" <<std::endl ;}
};

int main() {

    complexe c1 (2,3);
    c1.affiche();
    c1 = 6;
    c1.affiche();
    c1 = 'c';
    c1.affiche();

    complexe c2{'5', '9'};
    c2.affiche();

    complexe c3{-20};
    c3.affiche();

    complexe c4{'5'};
    c4.affiche();

    joueur joueur_1{"pierre"};
    std::cout << "joueur_1.nom = " << joueur_1._nom << std::endl;
    joueur_1 = 5;
    std::cout << "joueur_1.nom = " << joueur_1._nom << std::endl;

    std::string n{"bonjour"} ;
    n = 5;

    joueur joueur_2{32};

    std::string n2{26} ;
    
return 0;
}

La ligne 43 renvoie l’erreur error: no match for 'operator=' (operand types are 'joueur' and 'int') alors que la ligne 29 passe sans avertissement. Quant à la ligne 49, elle renvoie l’erreur error: no matching function for call to 'joueur::joueur() alors que la ligne 51 elle aussi compile sans avertissement.

Je voudrais s’il vous plaît savoir pourquoi est ce qu’avec la classe joueur la conversion de type n’est pas possible ?

J’utilise VS Code avec le compilateur mingw64 version 12.2.0

Merci d’avance pour vos retours :)

Salut,

La ligne 29 passe parce que tu initialises ton nombre complexe avec un nombre ('c' est un char donc un nombre) alors que la ligne 43 est invalide (tu essaies de traiter un nombre comme une string).

Pour la ligne 51 j’imagine que c’est le constructeur de string qui fournit une conversion pour ce cas, alors que tu t’en as pas sur ta classe joueur.

Bonjour,

Grossièrement, un char et un int, c’est la même chose pour le compilateur. Ça explique pourquoi la ligne 29 ne pose pas de problème.

Les lignes 43 et 49 ont le même problème : pour construire un joueur, il te faut une std::string, mais std::string n’a pas de constructeur implicite à partir de int.

La ligne 51 fonctionne parce que std::string a un constructeur explicite qui prend un int en entrée. Enfin, je suppose, je ne vois pas quel constructeur est utilisé et je suis pas sur mon ordinateur pour tester.

Edit: le constructeur ligne 51 est celui utilisant un std::initializer_list<char>.

+3 -0

Edit: le constructeur ligne 51 est celui utilisant un std::initializer_list<char>.

Berdes

Le nombre qui est reçu est la valeur numérique du caractère. Exemple

int main()
{
    std::string str {65};
    std::cout << "chaine = "  << str << std::endl;
}

affiche "chaine = A" (et pas 65, la chaine qui représente en décimal la valeur 65)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte