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 :

programme simple sur les pointeurs et les classes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Par défaut programme simple sur les pointeurs et les classes
    bonjour,
    Je travail avec code::Blocks 17.12, j'aimerais bien comprendre les pointeurs et les classes d'objets.
    J'ai donc décidé de faire une liste chainée de pointeurs et je lis et enregistre dans un fichier des mots aux format texte, (chaine.txt).
    j'ai construis un programme de deux fichiers : un header > ptr_Hmot.h et un main.cpp. j'ai pour sortie une VT ou une fenètre commande sous windows.
    voici mon petit programme :
    1/ header >> ptr_Hmot.h
    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
    #ifndef PTR_HMOT_H_INCLUDED
    #define PTR_HMOT_H_INCLUDED
    #include <iostream>
    #include <string>
    class PTR_Hmot
    {
        public:
     
        PTR_Hmot();
        void ajouter_ptr (std::string nouveau_mot);
        void inserer_ptr(std::string nouveau_mot);
        void maj_ptr(std::string nouveau_mot);
        void supprimer_ptr():
        void afficher_ptr(std::string af_mots); // C::B s'arrête ici, je ne vois pas pourquoi
        void charger_fichier();
        void ecrire_fichier();
        ~PTR_Hmot();
     
        private:
     
        double debut *m_debut;
        std::string mot *m_mot;
        double *m_fin;
     
    };
    2/ le main.cpp mais pas totalement implémenté :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <iostream>
    #include <fstream>
    #include <string>
     
    #include "ptr_Hmot.h"
    using namespace std;
     
    int main()
    {
       string mot;
       string mots;
       char reponse='Z';
        PTR_Hmot::PTR_Hmot(m_debut(0),m_mot(""),m_fin(0));
    do
    {
            cout << "A-charger fichier; B-Ajouter ptr; C-maj ptr; D-supprimer ptr; E-inserer ptr; F-lire ptr; G-écrire fichier; Q-detruire/quit";
            cin >> reponse;   
            switch(reponse)
            {
            case 'A':
                PTR_Hmot::charger_fichier(af_mot);
                {
                           int i=0;
                           ifstream fichier("/home/phipo/C++/ptr_002/chaine.txt");
                           if(fichier)
                           {
                           string ligne; //Une variable pour stocker les lignes lues
                              while(getline(fichier, ligne))
                              {
                                 cout << ligne << endl;
                                 m_mot-> new mot(ligne);
                                 m_debut->i+1;
                                 m_fin->i+2;
                                 i=i+1;
                              }
                           }
                           else
                           {
                              cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
                           }
                }
            break;
            case 'B':
                PTR_Hmot::ajouter_ptr(mot);
                {
     
                }
            break;
            case 'C':
                PTR_Hmot::maj_ptr(mot);
                {
     
                }
           break;
           case 'D':
                PTR_Hmot::supprimer_ptr();
                {
     
                }
           break;
           case 'E':
                PTR_Hmot::inserer_ptr(mot);
                {
     
                }
           break;
           case 'F':
                PTR_Hmot::afficher_ptr(mots);
                {
     
                }
           break;
           case 'G':
                PTR_Hmot::ecrire_fichier(chaine);
                {
     
                }
           break;
     
            }
            cout << "A-charger fichier; B-Ajouter ptr; C-maj ptr; D-supprimer ptr; E-inserer ptr; F-lire ptr; G-écrire fichier; Q-detruire/quit";
            cin >> reponse;
     
    }while (reponse != 'Q');
    return 0;
     
    }
    dans un premier temps je voudrais lire mon fichier chaine.txt d'une dixaines de mots pour les charger en mémoire grâce aux pointeurs.
    Lors de la compilation C::B s'arrête sur une ligne de mon header.
    comment faut'il si prendre ?

    Salutations
    Philippe

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut



    Tu as mis un deux points au lieu d'un point virgule


    Question : Pourquoi tu mets 1 bloc vide dans chacun des case (main) ?

  3. #3
    Membre éclairé Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Par défaut
    Je les remplirais plustart deja je veux charger le fichier chaine.txt dans des pointeurs, aprés je ferais l'implémentation de mes méthodes (bloques vides).
    Je veux savoir si je suis dans le bon chemin,
    Je ne demande pas que l'on écrive a ma place le programme , si c'est cela ta question ?

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 564
    Par défaut
    Bonjour.

    Avant toute chose, C::B s'arrête sur une ligne de code de votre entête avec un message d'erreur ou un warning ?
    Quel est ce message ?

    Ensuite, vous avez déclaré votre objet PTR_Hmot dans un fichier entête mais vous n'implémentez pas les méthodes de PTR_Hmot dans un fichier source ptr_Hmot.cpp. Du coup lors du premier appel à une méthode d'un objet qui n'est pas implémentée vous vous faites rappeler à l'ordre par le compilo.

    De plus aucune des méthodes de votre classe n'est déclarée static donc il n'est pas possible de les appeler sans instancier un objet.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    PTR_Hmot::PTR_Hmot(m_debut(0),m_mot(""),m_fin(0)); Qu'espères-tu réaliser avec cette syntaxe en plein milieu du main ?
    Ce n'est pas du tout la façon d'implémenter une fonction - ou ici un constructeur,.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    @Bousk, philo71 se croit en JavaScript et pouvoir définir des fonctions dans des fonctions

    D'ailleurs, si tu regardes bien, il a fait une entête ptr_Hmot.h avec les "include guards" : bonne action.
    Moi, j'ai cherché les définitions/ implémentations parce que philo71 nous demande notre avis. Bien, c'est simple, ptr_Hmot.cpp et mixé avec le main, et ce sont tous les blocs vides dans le switch.


    philo71 un conseil : Regarde un hello world même en C pour commencer. Ton code c'est n'importe quoi

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Je dois t'avouer que ta classe me laisse perplexe...:
    • De deux choses, l'une: ou bien elle va te servir pour représenter les éléments d'une liste chainée, ou bien, elle va te servir pour représenter la liste chainée en elle-même. Mais, en l'état, je n'arrive pas à déterminer dans quel cas nous sommes;
    • La présence d'un élément nommé m_debut semble indiquer que nous serions peut-être face à la liste chainée, mais, dans ce cas, pourquoi avoir appelé ta classe PTR_Hmot, et non quelque chose comme ListeMots ou comme WordList
    • Mais, si cette donnée est sensée représenter le premier mot de la liste, pourquoi lui avoir donné le type "pointeur sur double" Cela n'a absolument aucun sens!
    • De même, la donnée m_fin pourrais avoir du sens, mais, pourquoi en avoir fait un pointeur sur double Cela n'a pas d'avantage de sens!
    • Enfin, pourquoi avoir un pointeur sur std::string pour la donnée m_mot
    • D'ailleurs, la notation hongroise n'as pas vraiment d'intérêt dans le cas présent, sans oublier que, si on peut assez facilement déduire que PTR représente ... un pointeur, on va se demander à quoi correspond le H (serait-ce Holder )

    Je conçois que ton souhait soit de t'amuser avec les pointeurs, mais cela n'empêche de travailler un tout petit peu correctement...

    Si tu veux créer une liste chainée de chaines de caractères, tu as besoin de deux notions:
    1. la notion d'élément et
    2. la notion de liste chainée.

    Tu devrais donc avoir quelque chose proche de
    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
    struct Element{
        std::string value;
        Element * previous;
        Element * next;
    }
    class Liste{
    public:
        Liste();
        Liste(Liste const & );
        Liste & operator = (Liste const &);
        ~Liste();
        Liste & add(std::string const &);
        void readFromFile(std::string const &);
        void writeToFile(std::string const &) const;
        void print() const;
    private:
        Element * first;
    };
    (je te laisse le soin d'implémenter les différentes fonctions )
    qui te permettra une utilisation proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(){
        Liste liste;
        liste.add("salut")
             .add("hello")
             .add("monde")
             .add("world");
        liste.writeToFile("fichier.txt");
        Liste other;
        other.readFromFile("fichier.txt");
        other.print();
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Question sur les pointeurs avec les fonctions
    Par Loester dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2012, 22h56
  2. question sur les pointeurs dans les structures!
    Par bilal_sayed1 dans le forum Débuter
    Réponses: 1
    Dernier message: 19/02/2010, 07h33
  3. [VB6]Enumérer les attributs et les méthodes d'une classe
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/05/2004, 18h34
  4. pointeurs, toujours les pointeurs :/
    Par giviz dans le forum C
    Réponses: 16
    Dernier message: 08/10/2003, 15h02

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