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 :

cast de char * en une class


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut cast de char * en une class
    Bonjour à tous

    J'ai travaillé sur une class nomé "string" qui est en faite un tableau de caractère, et un ensemble de fonction pour géré la taille du tableau a fin de facilité mes manipulation de chaîne de caractère.

    J'ai fais une fonction pour l'operateur = avec comme argument un char * et cela marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string string::operator = (char * Value) { blabla }
    Grace à cela, je peut faire donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string MaChaine = "hello word" ;
    sans aucun souci.

    J'ai ensuite modifier une fonction pour passer de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int loadHeightMap (char * FilePath, int Width, int Height);
    à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int loadHeightMap (string FilePath, int Width, int Height);
    Seulement, quand j'appel cette fonction de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    loadHeightMap ("worlds/USA.raw", 400, 400);
    Cela ne marche pas ... Bien entendu, j'ai essayer avec un cast
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    loadHeightMap ((string)"worlds/USA.raw", 400, 400);
    Mais sans succès.

    Je souhaiterai que ma conversion char * vers string aussi parfaite que int vers float comme dans cette exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float maFonction (float Value) // definition d'une fonction attendant un float
    {
    return Value * 5.0f ;
    }
     
    // mais un appel avec un int
    int a = 2 ;
    floar b = maFonction (a);
    Comment puis je faire ?

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Avant toute chose, on est bien d'accord que tu développes une classe string à but purement éducatif, hein ?
    Dans un vrai programme, on utilise std::string de la librairie standard, pas sa classe maison buggée.

    Pour en revenir au problème, il manque probablement un constructeur prenant des char* :
    Lorsque tu écris loadHeightMap ("worlds/USA.raw", 400, 400); le compilateur voit le premier argument comme un char* ("worlds/USA.raw"), or il s'attend à une string vu la signature de la fonction. Il va donc chercher à construire une string à partir d'un char* ce qui n'est possible que si tu as définis ce constructeur prenant un char*.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Merci D'avoir répondu si rapidement

    Purement, éducatif, dans un sens ... Mais c'est que je fais un jeux vidéo, et certain textes peuvent être modifier (comme un chant de texte par exemple), la conversion td::string > char * à chaque image, pour ensuite l'entrer dans une fonction de rendu de texte, c'est lourd, tandis que si je fais mon système de string moi même, je gagne en rapidité car je peut programmer une fonction qui passe directement avec la class string que j'ai faite.

    j'avais penser à faire une fonction qui me converti, mais le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    loadHeightMap (convertToString ("worlds/USA.raw"), 400, 400);
    , c'est pas propre et pratique.

    Ma class possède déjà un constructeur string (), est il possible d'avoir 2 constructeurs ?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Déjà, je n'ai pas du tout compris en quoi le passage de std::string vers char*, qui est direct, serait moins bien fait que ce que tuproposes de faire avec ta classe.

    Ensuite, oui, un constructeur peut être surchargé, comme une fonction classique, aucun problème. Par contre, là, ça risque de ne pas marcher avec un paramètre char*, il vaut mieur prévoir un char const *.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  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 LastSpear
    Purement, éducatif, dans un sens ... Mais c'est que je fais un jeux vidéo, et certain textes peuvent être modifier (comme un chant de texte par exemple), la conversion td::string > char * à chaque image, pour ensuite l'entrer dans une fonction de rendu de texte, c'est lourd, tandis que si je fais mon système de string moi même, je gagne en rapidité car je peut programmer une fonction qui passe directement avec la class string que j'ai faite.e.
    Je ne comprends pas cette phrase.
    Dans la pratique, nos fonctions ressemblent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void loadHeightMap (const std::string& file, int width, int height)
    {
    //...
    }
     
    int main()
    {
       loadHeightMap ("worlds/USA.raw", 400, 400);
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 30
    Par défaut
    Citation Envoyé par LastSpear Voir le message
    J'ai fais une fonction pour l'operateur = avec comme argument un char * et cela marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string string::operator = (char * Value) { blabla }
    Grace à cela, je peut faire donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string MaChaine = "hello word" ;
    sans aucun souci.
    Ne confonds pas string MaChaine = "hello word"; avec string s; s = "Hello world". Dans le deuxième cas, le constructeur sans paramètres string() est invoqué, puis l'opérateur = est effectivement appelé.

    Par contre dans le premier, c'est comme si tu écrivais string MaChaine(string("hello world")); Ici, tu as deux constructeurs, string(const char*) et string(const string& other). Le deuxième est optimisé par le compilateur et n'est effectivement pas appelé (sauf si tu le déclares comme "explicit").

    De plus, string(const char* s), te permet aussi de transformer implicitement un char* en string et donc de passer un char* en paramètre là où tu attends un string.

    Il te manque donc probablement un constructeur string(const char* s)...

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Merci beaucoup, çà marche à merveille. Pour détailer c'est que je ne peut pas ajouter des fonctions à std::string, par exemple, faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string MyString = "hello word" ;
    MyString.draw ();
    Je devrais passé de std::string à char * puis appeler une fonctions en argument à chaque image afficher à l'écrans, c'est sur, la différence n'est pas bien grand niveau performance, c'est clair, mais sur l'exemple d'un champ de texte (comme celui ou je vous écrit, car en OpenGL, nous devons tout faire nous même), je doit pouvoir modifier les caractère en milieux de chaîne ma solution est je pense plus rapide que std::string. Et bien entendu, ce que j'aime dans la programmation, est de tout faire, les chaînes sont des petits raisonnement, mais sympa à faire. J'aime savoir se que j'utilise dans la moindre lignes, pour être au plus sur de soit au fur et à mesure du développement. (fou me diriez vous ? Je ne vous en voudrais pas )

    Il ne me reste plus qu'a trouver une solution pour faire dans le sens inverse : de ma class string > char * pour les endroits ou je n'aurai pas encore tout remplacé, que cela puisse marcher.

    En plus, je suis assez satisfait de mon resultat, car je peut tout autemp faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyString += "Je m'appel " + UserName + " et je vous remerci"

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    En même temps une fonction membre draw sur une classe de chaine de caractères c'est euh... étonnant.
    Déjà que l'interface de std::string est (sur)chargée.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    oui, c'est parce que comme je développe un jeux vidéo, certaine chaînes (pour ne pas dire beaucoup) de caractère doivent être affiché à l'écran (sur tout dans un jeux de stratégie, ce que je développe).

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2004
    Messages : 30
    Par défaut
    Citation Envoyé par LastSpear Voir le message
    Il ne me reste plus qu'a trouver une solution pour faire dans le sens inverse : de ma class string > char * pour les endroits ou je n'aurai pas encore tout remplacé, que cela puisse marcher.
    Tu peux faire ça soit avec une méthode ad hoc (const char* c_str()) soit en proposant un opérateur de transtypage de string en char*: string operator const char* ()

    Attention: dans les deux cas tu risques de désencapsuler le char* interne de ton string.

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Citation Envoyé par cyberpi Voir le message
    Ne confonds pas string MaChaine = "hello word"; avec string s; s = "Hello world". Dans le deuxième cas, le constructeur sans paramètres string() est invoqué, puis l'opérateur = est effectivement appelé.

    Par contre dans le premier, c'est comme si tu écrivais string MaChaine(string("hello world")); Ici, tu as deux constructeurs, string(const char*) et string(const string& other). Le deuxième est optimisé par le compilateur et n'est effectivement pas appelé (sauf si tu le déclares comme "explicit").

    De plus, string(const char* s), te permet aussi de transformer implicitement un char* en string et donc de passer un char* en paramètre là où tu attends un string.

    Il te manque donc probablement un constructeur string(const char* s)...
    Merci beaucoup du conseil, C'est vrai que je n'y avais pas pensé. Après, je ne vous cacherai pas que c'est rare que je fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string MaChaine = "hello word";
    Car les chaînes de caractère en variable sont souvent variable , sinon, je les métrerais directement en paramètre de fonction (printf() et compagnie). Je les mettais sur le forum à titre d'exemples.

    Tu peux faire ça soit avec une méthode ad hoc (const char* c_str()) soit en proposant un opérateur de transtypage de string en char*: string operator const char* ()

    Attention: dans les deux cas tu risques de désencapsuler le char* interne de ton string.
    Merci beaucoup de la solution ! Je vais tester çà tout de suite

    C'est très agréable d'avoir des réponses clairs et immédiates et je vous remercie tous de votre aides très généreuse.

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Citation Envoyé par cyberpi Voir le message
    Tu peux faire ça soit avec une méthode ad hoc (const char* c_str()) soit en proposant un opérateur de transtypage de string en char*: string operator const char* ()

    Attention: dans les deux cas tu risques de désencapsuler le char* interne de ton string.
    Très bien, j'ai réussi avec cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string operator const char* ()
    Encore merci pour tout les gas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/07/2011, 14h59
  2. Réponses: 25
    Dernier message: 11/08/2010, 15h54
  3. [POO] Cast d'objet vers une classe
    Par karl3i dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2009, 10h12
  4. Cast d'une classe generic
    Par Seth77 dans le forum C#
    Réponses: 3
    Dernier message: 27/06/2008, 14h27
  5. Réponses: 8
    Dernier message: 22/03/2006, 18h24

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