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

Discussion :

Utilisation d'une variable d'une autre classe

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 44
    Points
    44
    Par défaut Utilisation d'une variable d'une autre classe
    bonjour,

    j'ai un peu honte de poser cette question car a mon avis la réponse est tres simple, mais je m'en sors pas.

    voila j'ai une classe pour me connecter a une base sqlite.
    mon .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
     
    class baseDeDonnees: public QWidget
    {
        public :
                // constructor : initialise the database
                baseDeDonnees(QString );
     
        private :
                // function : create connexion to the database
                void dbConnexion();
     
                // parameters
                QSqlDatabase d_db;
                QString d_dbname;
                bool etatConnection ;
    };
    mon .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
     
    baseDeDonnees::baseDeDonnees(QString dbname): QWidget(), d_dbname(dbname)
    {
            dbConnexion();
    }
     
    void baseDeDonnees::dbConnexion()
    {
        //QSqlDatabase::addDatabase("QSQLITE",d_dbname);
        d_db = QSqlDatabase::addDatabase("QSQLITE");
        d_db.setDatabaseName(d_dbname);
     
        if ( !d_db.open() )
        {
             QMessageBox::warning(this, "Erreur Ouverture", d_db.lastError().text());
             etatConnection == false ;
        }
        else
        {
            QMessageBox::information(this, "Bonne Ouverture", "Connexion BD Ok!");
            etatConnection==true;
        }
    }
    jusque la tout se passe bien.

    Dans mon .cpp de ma fenetre principale je souhaite utiliser le résultat de la variable "etatConnection". J'ai essayer de différente façon, mais rien a faire, je n'y arrive pas.
    j'ai essayer comme ça :
    baseDeDonnees etat ;
    etat = baseDeDonnees.etatConnection;
    En plus je crois que je l'ai déjà fais, mais je ne sais plus

    Une petite aide serai la bienvenue, merci.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu as déclaré etatConnexion (je l'écris tout en français, tu as mixé français/anglais) privée, ce qui est normal. Donc c'est aussi normal que tu ne puisses pas y accéder. Il faut faire un "getter" (accesseur).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    j'ai placer ma variable etatconnexion dans public.

    mais c'est quoi les "getter" ?

    merci

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Je viens du Java, on a l'habitude de parler de "getters" et "setters", venant de l'anglais "get" et "set", soit les accesseurs des attributs de classe.

    Pour respecter le principe d'encapsulation, on ne déclare jamais les attributs public. En revanche, on utilise donc des accesseurs, soit des méthodes pour manipuler ces attributs.

    Code C++ : 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
    class MaClasse {
     
    public:
        MaClasse();
     
        bool attribut(); // getter
        void setAttribut(const bool valeur = true); // setter
     
    private:
        bool _attribut;
    };
     
    MaClasse::MaClasse() : _attribut(false)
    {
    }
     
    bool MaClasse::attribut()
    {
        return _attribut;
    }
     
    void MaClasse::setAttribut(const bool valeur)
    {
        _attribut = valeur;
    }

    On utilise aussi généralement des fonctions inline pour ça.

    J'espère maintenant que tu as tous les mots clefs qu'il faut pour compléter tes recherches et avancer.

    Edit : FAQ C++, y'a tout. http://cpp.developpez.com/faq/cpp/?p...SSE_accesseurs

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    merci,

    grâce a toi je viens d'apprendre quelque chose de très intéressant. Et c'est très bien expliqué.

    Le seul soucis c'est que je n'arrive toujours pas a connaitre l’état de ma variable etatConnexion dans "mainWindows.cpp".
    (j'ai un fichier mainWindows.cpp et .h , un baseDeDonnees.cpp et .h et main.cpp)

    J'ai mis dans mon mainWindows.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool etat ;
    etat = baseDeDonnees::etatConnexion();
    et ca me met comme erreur de compilation :
    cannot call member function 'bool baseDeDonnees::etatConnexion()' without object
    C:\Users\sebastien\Projet C++\GestionPi-build-desktop\..\GestionPi\mainwindow.cpp
    mon baseDeDonnees.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
     
    class baseDeDonnees: public QWidget
    {
        public :
                // constructor : initialise the database
                baseDeDonnees(QString );
     
     
                // parametres
                bool etatConnexion() ; //getter
                void setEtatConnexion(const bool valeur = true) ; //setter
     
     
        private :
                // function : create connexion to the database
                void dbConnexion();
                void creerTable();
     
     
                // parameters
                QSqlDatabase d_db;
                QString d_dbname;
                bool _etatConnexion ;
    };
    merci

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu ne peux pas utiliser une méthode comme ça, il faut faire un objet instance de cette classe et appeler la méthode dessus. D'ailleurs, on met une majuscule aux noms de classe.

    Les méthodes qu'on utilise avec Classe::methode() sont les méthodes de classe, ou méthodes statiques (mot clef "static").

    Je ne sais pas ce que tu veux faire exactement, mais soit tu veux que les instances de ta classe BaseDeDonnees aient toutes leur propre "etatConnexion", donc tu laisses comme ça :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BaseDeDonnees bdd;
    bool etat ( bdd.etatConnexion() );
    soit etatConnexion est commun à toutes les instances de la classe, dans ce cas tu le déclare static ainsi que ses accesseurs.

    Edit pour le message d'après : oui et dessous aussi avec le ==true.

  7. #7
    Membre éprouvé

    Profil pro
    Responsable logiciel
    Inscrit en
    Octobre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable logiciel

    Informations forums :
    Inscription : Octobre 2010
    Messages : 223
    Points : 1 183
    Points
    1 183
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        if ( !d_db.open() )
        {
             QMessageBox::warning(this, "Erreur Ouverture", d_db.lastError().text());
             etatConnection == false ;
        }
    Pas bon ça, il y a un = de trop dans "etatConnection == false"

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    En faite, voila ce que je veux faire. (pour essayer d’être plus claire)

    Donc j'ai créer un projet Qt avec une mainWindows. J'ai créer une base de données SQLite.
    J'ai donc insérer dans mon projet un baseDeDonnees.h et .cpp ou je créer mes fonction de connexion a la bdd, de création de table, etc ...
    Ce que je cherche a faire, c'est qu'au démarrage de l'application, je test si la connexion est bien établie, et le noter dans ma fenêtre principale. Donc pour ça, j'essaie de récupérer la valeur de ma variable etatConnexion (déclarer dans baseDeDonnees.h) dans mon fichier mainwindows.cpp. Mais je n'y arrive pas.

    Voila, j'espère que comme ca c'est un peu plus claire.

    J'ai essayé de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    baseDeDonnees bdd;
    bool etat ( bdd.etatConnexion() );
    dans le "mainwindows.cpp" , mais ca me met une erreur de compilation :
    no matching function for call to 'baseDeDonnees::baseDeDonnees()'
    C:\Users\sebastien\Projet C++\GestionPi-build-desktop\..\GestionPi\mainwindow.cpp
    Idiallo, le "etatConnection == false" c'etait une ancienne ligne que j'avais pas supprimer, merci de me signaler que la encore j'avais fais une connerie.

  9. #9
    Membre éprouvé

    Profil pro
    Responsable logiciel
    Inscrit en
    Octobre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable logiciel

    Informations forums :
    Inscription : Octobre 2010
    Messages : 223
    Points : 1 183
    Points
    1 183
    Par défaut
    L'erreur de compilation vient de ce que le constructeur de baseDeDonnees prend un paramètre et que tu essaie de construire un objet de ce type sans paramètre.
    Si tu veux effectivement créer ton objet base à cet endroit et accéder à l'état c'est qqchose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    baseDeDonnees base(nom);
    bool etat = base.etatConnexion();

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    merci

    ça fonctionne.
    Merci pour votre aide, car j'avais pas été très claire.

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

Discussions similaires

  1. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30
  2. Réponses: 6
    Dernier message: 20/04/2007, 15h24
  3. Réponses: 1
    Dernier message: 15/02/2007, 00h24
  4. Passer une variable d'une form a l'autre
    Par 6BORG dans le forum Delphi
    Réponses: 3
    Dernier message: 19/08/2006, 17h15
  5. [debutant]passager une variable d'une page a une autre
    Par Eisy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/03/2006, 11h18

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