OVH Cloud OVH Cloud

Constructeur "par defaut"

14 réponses
Avatar
Mathieu Malaterre
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
Mathieu

10 réponses

1 2
Avatar
Fabien LE LEZ
On Wed, 23 Jun 2004 03:21:53 GMT, Mathieu Malaterre :

Le probleme c'est que lorsque je l'utilise typiquement en passant
argv[1] (const char*)


Non, char* (du moins si tu parles bien des arguments de main()).

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


foo mon_fou (std::string (argv[1]));


--
schtroumpf schtroumpf

Avatar
Fabien LE LEZ
On Wed, 23 Jun 2004 05:55:44 +0200, Fabien LE LEZ
:

foo mon_fou (std::string (argv[1]));


Au fait, est-ce que ceci est considéré comme un cast, au même titre
que static_cast<std::string>(argv[1]) ?


--
schtroumpf schtroumpf

Avatar
Jean-Marc Bourguet
Mathieu Malaterre writes:

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 ?


Ajouter le constructeur
foo(char const*);
naturellement.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

On Wed, 23 Jun 2004 05:55:44 +0200, Fabien LE LEZ
:

foo mon_fou (std::string (argv[1]));


Au fait, est-ce que ceci est considéré comme un cast, au même titre
que static_cast<std::string>(argv[1]) ?


Ca fait la meme operation: appel au constructeur std::string(char const*).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Fabien LE LEZ
On 23 Jun 2004 08:19:15 +0200, Jean-Marc Bourguet :

Au fait, est-ce que ceci est considéré comme un cast, au même titre
que static_cast<std::string>(argv[1]) ?


Ca fait la meme operation


Je sais. Ma question n'est qu'une question de vocabulaire : peut-on
appeler ça un "cast" ?


--
schtroumpf schtroumpf


Avatar
Aurélien REGAT-BARREL
Voila mon probleme j'ai une classe:

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



Ne serait-ce pas plutôt vtkFoo ? ;-)

--
Aurélien REGAT-BARREL

Avatar
Mathieu Malaterre
Fabien LE LEZ wrote:
On Wed, 23 Jun 2004 03:21:53 GMT, Mathieu Malaterre :


Le probleme c'est que lorsque je l'utilise typiquement en passant
argv[1] (const char*)



Non, char* (du moins si tu parles bien des arguments de main()).


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



foo mon_fou (std::string (argv[1]));


Ca veut dire qu'un utilisateur de ma classe doit lire la documentation
qui va alors lui indiquer qu'il ne peut pas passer des const char*, mais
qu'il doit faire lui meme les cast explicit.

J'ai beau rajouter un explicit devans la declaration de la classe, g++
s'en moque et me cast mon char* (ou const char*) en bool sans me prevenir...

Merci
Mathieu


Avatar
Mathieu Malaterre
Jean-Marc Bourguet wrote:
Mathieu Malaterre writes:


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 ?



Ajouter le constructeur
foo(char const*);
naturellement.


J'ai une douzaine de classes comme j'ai pas envie de rajouter un 'patch'
bizarre comme ca.

Mathieu


Avatar
Mathieu Malaterre
Aurélien REGAT-BARREL wrote:
Voila mon probleme j'ai une classe:

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




Ne serait-ce pas plutôt vtkFoo ? ;-)


Ben non :p c'est sur mon temps libre, je dev sur la lib gdcm:

http://creatis-www.insa-lyon.fr/Public/Gdcm/

Mathieu


Avatar
Franck Branjonneau
Mathieu Malaterre écrivait:

Jean-Marc Bourguet wrote:
Mathieu Malaterre writes:

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 ?
Ajouter le constructeur

foo(char const*);
naturellement.


J'ai une douzaine de classes comme j'ai pas envie de rajouter un
'patch' bizarre comme ca.


Alors enlever

foo(std::string const &)

et ajouter

template< typename InputIterator >
foo(InputIterator first, InputIterator last)
--
Franck Branjonneau



1 2