Forum Programmation.c++ Constructeur

Posté par  (site web personnel) .
Étiquettes : aucune
0
23
juin
2004
Cool je suis le premier a poster sur ce forum!

Voila mon probleme j'ai une classe:

class foo{
public:
foo(bool b);
foo(std::string const &s);
};

Le probleme c'est que lorsque je l'utilise typiquement en passant argv[1] (const char*), c++ definit comme comportement par defaut de prendre l'operation la plus simple. Dans mon cas il va caster mon const char* en bool plutot que de demander le constructeur de string.

Est-ce qu'un guru c++ sait s'il y a un moyen de force la bete a utiliser celui que je veux ?

Merci
  • # Mon titre a ete change !

    Posté par  (site web personnel) . Évalué à 1.

    Le vrai titre etait:

    Constructeur "par defaut"

    je suppose que templeet m'a parse mes `"` et transformer en balises...
  • # un début de réponse...

    Posté par  (site web personnel) . Évalué à 3.

    par ce que std::string et const char* ne sont pas les mêmes types...

    essaie, je pense, de faire un vrai std::string à partir de ton const char*

    (car const char* est en fait un tableau de char et std::string est une classe C++ permettant de gérer les chaînes de caractères)
    • [^] # Re: un début de réponse...

      Posté par  . Évalué à 2.

      Pareil.

      Je suis pas un gourou c++, mais ce que tu veux faire, c'est pas joli joli :p.

      Ce que tu veux, c'est modifier le comportement du compilateur, en effet, le cast char* -> bool se fait à la compilation et pas à l'exécution. Les casts implicites sont une facilité fournie par le compilateur (et surement par le standard c++) pour alléger et améliorer la lisibilité du code.

      Donc si tu veux aller à l'encontre du comportement standard du compilateur, tu commences à faire des trucs pas très jolis.

      Le plus propre serait : faire un cast explicite avant l'appel du constructeur, ou faire un constructeur prenant comme type const char*. La dernière solution étant la plus propre si tu comptes proposer ta classe à d'autres devs. En effet, ce que tu recherches, c'est une notation propre et simple dans l'appel de ta classe, c'est du sucre syntaxique. Dans ce cas, ca demande toujours du travail supplémentaire derrière, pour cacher la facilité d'utilisation. De plus écrire un constructeur prenant un const char* est très facile a partir du constructeur à base de string.

      Sinon si tu veux vraiment forcer le cast, je pense qu'il doit surement exister des directives obscures permettant de modifier le comportement du compilo.
  • # Forcer le passage par std::string

    Posté par  . Évalué à 3.

    Non, c'est le comportement "normal" (on peut se demander ce que ca veut dire, personnellement j'appelerai ca un comportement dangereux).
    Le seul moyen, c'est de caster ton appel :


    foo((std::string)arv[1]);

    Ou, plus joli :

    foo(std::string(arv[1]));

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.