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 :

Petit exercice de transformation de type


Sujet :

C++

  1. #1
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut Petit exercice de transformation de type
    Bonjour,

    Je pense que c'est le moment pour moi de faire quelques exercice. Je m'était penché sur l'idée de travaillé sur l'héritage. J'ai vue déjà pas mal de choses et ça fonctionne.

    J'ai maintenant plus qu'un seul souci à régler et je pense que j'ai du raté quelque chose. J'ai pour habitude; certainement pas la meilleure des habitudes; de couplée texte et chiffre tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int truc = 2;
    std::string machin = "truc" + truc + "\n";
    En théorie seulement, ça devrais marché. Un string sachant afficher en théorie du chiffre.

    En pratique, si ça arrive à passer, c'est devenu des lettres, et dans les 3/4 du temps j'ai des messages d'erreurs liée à char[]. En d'autres terme, suite à mon analyse, je me retrouve donc avec un std::string ne savant que travaillé sous char...

    Me voila dans l’embarras !

    Sans entrée dans une quelconque classe. Je pense déjà résoudre une partie du problème dans le main seul tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int truc = 2;
    stdstring conf = truc.str();
     
    std::string machin = "truc" + conf + "\n";
    D'une je ne suis pas certain que .str() soit la bonne solution.
    De deux, il n'est pas prouvé que ça soit la bonne logique.
    De trois, j'ai essayer de remplacer les + par <<. Le résultat est guère mieux !

    Je propose donc de faire l'étude de ce cas précis. En fonction du résultat et des expérimentation, je pense re écrire ma classe b hérité de a ou un membre de a, donc de b en héritge va afficher les infos au travers de l'interface a. Mais là, c'est une autre blague.

    Merci pour votre aide.

  2. #2
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Je ne suis pas sûr d'avoir compris la question mais peut être std::ostringstream dans <sstream> ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::ostringstream oss;
    oss << "truc" << truc << std::endl;
     
    std::string str = oss.str();

  3. #3
    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 Caxton Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int truc = 2;
    std::string machin = "truc" + truc + "\n";
    En théorie seulement, ça devrais marché. Un string sachant afficher en théorie du chiffre.
    Euu non il n'y a aucune raison que ça marche même "en théorie". Les seules choses convertibles en std::string en C++ sont les char* comme par exemple "truc" ou les char comme par exemple 'a'.

    Pour convertir un int en string tu peux utiliser stringstream, comme montré plus haut, ou encore std::to_string (qui sait convertir en gros entiers et flottants) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int truc = 2;
    std::string machin = "truc" + std::to_string(truc) + "\n";

  4. #4
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Bon, je viens d'essayer !

    Alors, voila ce qui se passe; ça compile, mais, si j'en crois la sortie écran, ça n'affiche rien !

    Donc à ce stade, je propose de vous montrer mon exercice dans son ensemble. Histoire de rectifier ce qui semble pas correct.

    Comme je disait, j'ai deux classes. L'une affiche en solitaire habituellement. L'autre est une extension (c'étais le terme java que j'utilisais) et qui devrait donc s'appuyer sur la première pour afficher les résultat.

    La première classe est une classe qui s'appuie sur std::string; la seconde sur des int. Il faudra à u moment donné passé de l'intéger vers du string. C'est ce que semble faire le code indiqué au dessus.

    Voila donc, sans plus attendre mon main:
    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
     
    #include <iostream>
     
    using namespace std;
     
    #include "message.h"
    #include "calcul.h"
     
    int main()
    {
        int t1 = 10;
        int t2 = 20;
     
        calcul calc;
        calc.setAdd(t1, t2);
        //cout << calc.res();
     
        return 0;
    }
    Ensuite, je fais venir la première classe. Celle qui affiche avec son .h suivi de son.cpp:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #ifndef MESSAGE_H
    #define MESSAGE_H
     
    #include <iostream>
     
    using namespace std;
     
    class message
    {
    public:
        message();
     
        void setType(std::string t = "NULL") { m_type = t; }
        void setMessage(std::string m = "") { m_message = m;}
     
        std::string send();
    private:
        std::string m_type;
        std::string m_message;
    };
     
    #endif // MESSAGE_H
     
    #include "message.h"
     
    #include <iostream>
     
    using namespace std;
     
    message::message()
    {
    }
     
    std::string message::send()
    {
        if((m_type == "NULL") || (m_message == ""))
        {
            m_type = "ERREUR";
            m_message = "ERREUR : Soit le type est manquant, soit le message est manquant !";
        }
     
        return m_type + "\n" + m_message + "\n";
    }
    Et enfin la classe qui hérite de la première:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #ifndef CALCUL_H
    #define CALCUL_H
     
    #include "message.h"
     
    class calcul : public message
    {
    public:
        calcul();
     
        void setAdd(int terme1 = 1, int terme2 = 1);
     
        int res();
     
    private:
        int m_terme1;
        int m_terme2;
        int resultat;
    };
     
    #endif // CALCUL_H
     
    #include "calcul.h"
     
    #include <sstream>
     
    calcul::calcul()
    {
    }
     
    void calcul::setAdd(int terme1, int terme2)
    {
        m_terme1 = terme1;
        m_terme2 = terme2;
        resultat = terme1 + terme2;
     
        std::ostringstream oss1;
        oss1 << "Addition pour " << terme1 << " + " << terme2 << " =" << std::endl;
        std::ostringstream oss2;
        oss2 << resultat << std::endl;
     
        setType(oss1.str());
        setMessage(oss2.str());
        send();
    }
     
    int calcul::res()
    {
        return resultat;
    }
    Je reconnais que c'est pas un programme très propre dans la mesure ou c'est un exercice. J'y ai tester beaucoup de choses et, par voie de conséquence, il a beaucoup évoluer.

    Sachez qu'a la fin, je devrais quand même créer dans la classe enfant, calcul, une méthode qui effectuera le calcul en private, et une méthode qui devra envoyer vers la classe 1 affin d'afficher.

    J'aimerais pousser un peu le concept de l'héritage. Pour comprendre son fonctionnement et, en plus pour m'appuyer sur cet exemple pour développer plus tard d'autres programmes.

    En attendant, je me suis bien amuser dans cette exemple, moi le novice, pour essayer de comprendre comment cela fonctionnais

    Sur ce, je vous tire ma révérence.

  5. #5
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Plop !

    Rofl, la flemme de faire un edit !

    Alors en fait, je faisait une bêtise Je n'affichais rien !

    J'ai modifier mon main ainsi :
    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
    22
    23
     
    #include <iostream>
     
    using namespace std;
     
    #include "message.h"
    #include "calcul.h"
     
    //#include <sstream>
     
    int main()
    {
        int t1 = 10;
        int t2 = 20;
     
        calcul calc;
        calc.setAdd(t1, t2);
        cout << calc.send();
     
        //cout << calc.res();
     
        return 0;
    }
    Et mon calcul.cpp comme cela :
    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
    22
    23
    24
    25
    26
    27
    28
     
    #include "calcul.h"
     
    #include <sstream>
     
    calcul::calcul()
    {
    }
     
    void calcul::setAdd(int terme1, int terme2)
    {
        m_terme1 = terme1;
        m_terme2 = terme2;
        resultat = terme1 + terme2;
     
        std::ostringstream oss1;
        oss1 << "Addition pour " << terme1 << " + " << terme2 << " =" << std::endl;
        std::ostringstream oss2;
        oss2 << resultat << std::endl;
     
        setType(oss1.str());
        setMessage(oss2.str());
    }
     
    int calcul::res()
    {
        return resultat;
    }
    Devinez quoi ?

    Ca marche ! ça marche !

  6. #6
    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
    ARf j'étais en train de taper une réponse comme quoi le seul std::cout du code était commenté et que la string retournée par send() n'était pas utilisée, mais tu as été plus rapide

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Citation Envoyé par Arzar Voir le message
    Euu non il n'y a aucune raison que ça marche même "en théorie". Les seules choses convertibles en std::string en C++ sont les char* comme par exemple "truc" ou les char comme par exemple 'a'.
    Ce n'est pas totalement vrai.
    Une classe peut implémenter une méthode de conversion explicite ou implicite vers std::string. On peut avoir jusqu'à trois conversions si je ne me trompe pas pour la résolution des surcharges d'une méthode.

    Quand on utilise un entier, ce dernier est juste convertit en char. Il est donc bien convertit mais pas de la manière qu'on souhaite.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/10/2006, 15h27
  2. Petit exercice de C++ !
    Par JoN28fr dans le forum C++
    Réponses: 6
    Dernier message: 13/10/2006, 22h09
  3. Réponses: 8
    Dernier message: 03/10/2006, 17h34
  4. [Sécurité] Petit exercice de cryptage
    Par raptor1 dans le forum Langage
    Réponses: 7
    Dernier message: 04/09/2006, 12h15
  5. [C++ > C# 2.0] Comment transformer les types ?
    Par nyarla01 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 16/03/2006, 12h36

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