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 :

Classe et méthodes


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Classe et méthodes
    Bonjour,

    Je me fais insulter par le compilateur parce que je fais quelque chose de travers mais je ne comprends pas pourquoi.

    Voici le code

    File.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
    #ifndef DEF_FILE
    #define DEF_FILE
     
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    class File
    {
        public:
     
        File( const char *path );
        FILE *open( const char *path, char *mode);
        unsigned int getFileLength(const char *path);
     
     
        private:
     
        FILE *file;
        char *path;
    };
     
    #endif
    File.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
    #include "File.h"
     
     
    using namespace std;
     
     
    File::File(const char *_path)
    {
        strcpy( path, _path);
    }
     
     
    FILE *File::open(const char *path, char *mode)
    {
        FILE *ptr = fopen( path, mode ) ;
     
        if ( ptr != NULL )
        {
            return ptr;
        }
    }
     
    unsigned int File::getFileLength(const char *path)
    {
        char character;
        unsigned int counter;
     
        file.open(path, "r");
     
        while ( fscanf(file, "%c", &character) != EOF )
        {
            counter++;
        }
     
        fclose(file);
     
        return counter;
    }
    Il braille ici ...

    ... m'insultant de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request for member 'open' in '((File*)this)->File::file', which is of non-class type 'FILE*'|
    Pourtant la méthode open est bien définie pour l'attribut file dans la classe File. Quelque chose m'échappe

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    file est un pointeur tu dois donc acceder a ces methode comme ceci:



    Edit: pan mauvaise réponse j'ai regarder l'erreur et tellement habituer a avoir cette erreur que je donne une solution pour l'erreur mais qui en génere une autre

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    ... m'insultant de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request for member 'open' in '((File*)this)->File::file', which is of non-class type 'FILE*'|
    Pourtant la méthode open est bien définie pour l'attribut file dans la classe File. Quelque chose m'échappe
    L'attribut file est un FILE* pas un File (ni un File*). Or la méthode open que tu as fait est un méthode de File pas de FILE. Tu ne peux donc pas appeler file.open(), par contre il faut bel et bien récupérer le résultat de open() dans file. Je suppose donc que tu voulais plutôt écrire file=open().

    A part ça, deux-trois remarques:
    • Dans la méthode open() en cas d'échec (fopen() renvoie NULL), le retour de la fonction vaut n'importe quoi et tu vas utiliser un pointeur invalide ensuite.
    • J'ai du mal à voir l'intérêt d'utiliser FILE plutôt que les flux C++ ici.
    • En C++, les headers C sont niommé cXXXX pas XXXX.h (cstdio à la place de stdio.h, etc.).
    • Tu te trimballes plusieurs headers inutiles dans File.h, par contre il en manque dans File.cpp.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par gl Voir le message
    A part ça, deux-trois remarques:
    Aux remarques pertinentes de gl, je rajouterais :
    • l'utilisation de std::string plutôt que char *
    • ça évitera de copier des données dans path sans l'avoir alloué
    • Pourquoi avoir un membre path et le passer en paramètre de toutes tes fonctions ?
    • éviter les noms commençant par souligné '_' : c'est un schéma de nom laissé aux compilateurs
    • si ce n'est pas un exercice, utilises les flux de la STL
    • même si c'est un exercice, utilises std::string car une classe ne doit gérer qu'une ressource et à ce moment ne faire que ça. Or tu as deux ressources : char* et FILE*.

  5. #5
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Ah oui exact ^^ Merci pour l'aide et les remarques, le code est grossier je le sais désolé pour les puristes ^^

    En fait je continue de coder en C en parallèle alors je préfère continuer à manipuler les chaines ainsi et pour le reste aussi car je ne veux pas oublier.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Très mauvaise démarche...

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

Discussions similaires

  1. Documentation des classes et méthodes
    Par nicocolt dans le forum Langage
    Réponses: 2
    Dernier message: 02/02/2007, 17h14
  2. Pattern singleton ou Classe avec méthodes statiques ?
    Par Claythest dans le forum Langage
    Réponses: 3
    Dernier message: 11/12/2006, 11h28
  3. Classe et méthode Javascript
    Par Gunn_ dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/07/2006, 13h10
  4. Pointeurs de classes et méthodes
    Par insomniak dans le forum C++
    Réponses: 9
    Dernier message: 10/05/2006, 15h18
  5. Déclaration de classes et méthodes externes
    Par rulianf dans le forum C++
    Réponses: 6
    Dernier message: 15/09/2005, 15h26

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