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

Langage C++ Discussion :

partager une classe entre plusieurs cpp: "which is of non-class type . "


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Par défaut partager une classe entre plusieurs cpp: "which is of non-class type . "
    Bien le bonsoir,
    j'ai oragnisé ma classe
    periph
    grâce à cette faq:
    https://cpp.developpez.com/faq/cpp/?...un-fichier-cpp

    avec une déclaration dans classes.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
    26
    27
    28
    29
    30
    31
    #ifndef CLASSES_H
    #define CLASSES_H
    #include <string>
    /************************************************************************/
    /* déclaration d'une classe periph pour les périphérique de stockage USB */
    /************************************************************************/
    class periph {
      public:
        std::string source;
        std::string target;
        const char* type = "vfat";
        const unsigned long mntflags = 0;
        const char* opts = "";
        int status;
        std::string dir;
      //
        periph() {}
        periph(std::string src, std::string tgt): source(src), target(tgt){}
     
        bool monte();
        bool demonte();
        void mkdirdate();// création d'un dossier "target" horodaté
     
       ~periph() {}
    };
     
    extern std::string s;
    extern std::string t;
    extern periph clef(std::string, std::string);
     
    #endif
    un include dans les fichiers .ccp auxquels je veux donner accés à cette classe
    et un classes.cpp pour définir la classe et construire
    clef
    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
    #include "classes.h"
    #include "define.h"
    #include "file.h"
    #include <sstream>
    #include <fstream>
    #include <sys/mount.h>
    #include <sys/stat.h>  //pour ACCESSPERM
     
    using namespace std;
    /************************************************************************/
    /* définition des fonctions de classe périph */
    /************************************************************************/
    bool periph::monte() {
      ostringstream tmpStr;
      status = mount(this->source.data(), this->target.data(), this->type, this->mntflags, this->opts);
      if (this->status == 0) {
        tmpStr <<  "        clef " << this->source << " montée TRUE";
        out(TERM|SESS,tmpStr.str());
        return true;}
      else {
        tmpStr <<  "        clef " << this->source << " montée FALSE" << this->status;
        out(TERM|SESS,tmpStr.str());
        return false;}
    }
     
    bool periph::demonte(){
      ostringstream tmpStr;
      status = umount(target.data());
      if (this->status == 0) {//cout <<  "        clef " << this->source << " démontée TRUE" << endl;
        tmpStr <<  "        clef " << this->source << " démontée TRUE";
        out(TERM|SESS,tmpStr.str());
        return true;}
      else {//cout << "        clef " << this->source << " démontée FALSE" << endl;
        tmpStr <<  "        clef " << this->source << " démontée FALSE";
        out(TERM|SESS,tmpStr.str());
        return false;}
     }
     
    void periph::mkdirdate() {// création d'un dossier "target" horodaté
      string nom_rep = target;
      date = horodatage();
      nom_rep.append("/");
      nom_rep.append(date);
      this->dir = nom_rep;
      status = mkdir(nom_rep.data(), ACCESSPERMS);
    // fichier de log des ccorr directement dans le dossier de photos
      string nom_fichier = nom_rep.data();
      nom_fichier.append("/log.cco");
      logSalve.open(nom_fichier.data());
      out(TERM|SESS|SALV,nom_fichier.data());
    }
     
    std::string s = "/dev/sda1";
    std::string t = "/mnt/tmp";
    periph clef(s, t);
    les fichiers .cpp contenant des appels du type
    clef.demonte();
    génèrent cette erreur à la compil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /.............../pict.cpp|195|error: request for member ‘demonte’ in ‘clef’, which is of non-class type ‘periph(std::string, std::string) {aka periph(std::basic_string<char>, std::basic_string<char>)}’|
    le fichier pict.cpp contient bien un include vers classes.h, mais il est vrai que je ne sais pas trop où je dois déclarer et définir clef, et comment le partager entre plusieurs fichier.

    Quelqu'un peut-il m'aider svp?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    En écrivant extern periph clef(std::string, std::string); que penses-tu déclarer?
    C'est bien une fonction n'est-ce pas?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Par défaut
    ah, ben c pas ce que je veux faire
    je souhaitais déclarer l'objet "clef" de la classe "periph"

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Par défaut
    et forcément, si à la place je déclare comme ceci

    extern periph clef
    ça marche beaucoup mieux

    c'était donc ça ? c'est correct et dans les règles de l'art maintenant?

    merci beaucoup dalfab, d'autant que j'apprécie ta réponse en forme de question qui pousse à réfélchir...

  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
    Correct : oui puisque ça compile.
    Dans les règles : bof, pourquoi créer un unique objet partagé ainsi qui sera global et ne pas le créer tout simplement dans le main ?
    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
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 524
    Par défaut
    Réponses rhétoriques.
    Citation Envoyé par Bousk Voir le message
    Correct : oui puisque ça compile.
    C'est SYNTAXIQUEMENT correct (et encore, d'autres compilateurs ou d'autres réglages peuvent rendre cela incorrect).
    Il faut aussi s’ôter de la tête ce sophisme très répandu chez les débutants "Ça compile donc ça marche".
    NON !!!

    Citation Envoyé par Bousk Voir le message
    Dans les règles : bof, pourquoi créer un unique objet partagé ainsi qui sera global et ne pas le créer tout simplement dans le main ?
    Illustration du "syntaxiquement correct" est différent du "correct pour faire du code fiable et maintenable dans le temps".

    Le questionnement socratique a le vent en poupe ou le pauvre PO @niconol fait-il les frais d'une expérience pédagogique ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Citation Envoyé par niconol Voir le message
    c'est correct et dans les règles de l'art maintenant?

    merci beaucoup dalfab, d'autant que j'apprécie ta réponse en forme de question qui pousse à réfélchir...
    Tu ajoutes deux questions.
    * Le code est effet correct.
    * Et tu demandes aussi si c'est dans les règles de l'art. A ceci tu as obtenu des réponses fournies sur l'utilisation de variables globales. Ici les trois variables s, t et clef non seulement sont globales mais aussi publiques car déclarées dans un fichier d'entête.
    Pour une toute-petite application c'est déjà perturbant, imagine une application de centaines de fichiers voire plus (oui on y arrive vite!), tous verraient des variables avec un risque d'oublier leur rôle et leur dynamique. L'idée est de ne rendre visible que ce qui sert aux autres modules, les règles de l'art consistent donc à limiter et même proscrire les globales.
    De même ta classe periph a tous ses membres publics. Là aussi les règles de l'art préconisent de ne rendre public qu'une ou deux fonctionnalités fournies par ta classe afin que l'utilisation tes objets periph soit plus limpide pour les futurs lecteurs de ton code dont tu es le plus représentatif.

    Alors ici, faut-il conserver la globale clef? Il est vrai que dans un code petit et simple, ce qui est important c'est que tu t'y retrouves et donc pourquoi pas. Dans un code plus "professionnel", elle peut être remplacée par d'autres structures que tu risques certainement de trouver complexe aujourd'hui.

Discussions similaires

  1. Partager une variable entre plusieurs classes
    Par jasonpolakow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/01/2011, 10h02
  2. partager l'instance d'une classe entre plusieurs thread ?
    Par contremaitre dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 29/07/2008, 11h53
  3. partager une struct entre plusieurs fils
    Par romainromain dans le forum Réseau
    Réponses: 8
    Dernier message: 22/11/2006, 20h22
  4. Réponses: 12
    Dernier message: 14/08/2006, 12h55
  5. Partager une version entre plusieurs DLL
    Par barthelv dans le forum MFC
    Réponses: 4
    Dernier message: 22/11/2005, 10h25

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