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 :

Erreur : invalid use of non-static data member

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut Erreur : invalid use of non-static data member
    Bonjour à tous.

    Je suis confronté à l'erreur suivante :invalid use of non-static data member 'MainWindow::m_initObjet' qDebug(MainWindow::m_initObjet->statutInitialisation);

    Je vais tenter de vous expliquer le plus clairement possible ma démarche :

    Le but recherché est de mettre à disposition les paramètres de connexion à un ftp.

    Voici le main qui lance l'interface de l'application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "mainwindow.h"
    #include <QApplication>
     
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    Avec le lancement de l'interface, je crée un objet d'initialisation qui va lire dans un fichier les paramètres nécessaires pour les mettre à disposition dans l'application :

    Voici la construction de l'interface :
    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
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "initialisation.h"
    #include "parametrage.h"
     
     
    #include <Qstring>
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
     
        ui->setupUi(this);
     
    // la création de l'ojet d'initialisation
        m_initObjet = new initialisation;
     
    // ici l'accès à la méthode statutInitialisation fonctionne sans problème
        QString message = QString::fromStdString(m_initObjet->statutInitialisation());
        this->statusBar()->showMessage(message);
     
    }
     
     
     
    MainWindow::~MainWindow()
    {
        delete m_initObjet;
        delete ui;
    }
    avec extrait du fichier .h, comme quoi m_initObjet est bien public.
    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
     
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QString>
    #include"initialisation.h"
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        initialisation *m_initObjet;
     
    private:
        Ui::MainWindow *ui;
     
    };
     
    #endif // MAINWINDOW_H
    et l'entête du fichier initialisation, avec sa méthode statutInitialisation, publique elle aussi :
    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
     
    #ifndef INITIALISATION_H
    #define INITIALISATION_H
     
    #include <map>
    #include <string>
     
     
    class initialisation
    {
    public:
        initialisation();
        ~initialisation();
        std::string statutInitialisation();
     
    protected :
     
     
    private:
        void checkInit();
        std::string m_messageInit;
        std::map<std::string,std::string> parametres;
        std::map<std::string,std::string>::iterator itparam;
    };
     
    #endif // INITIALISATION_H
    Ici je pense que l'objet m_initObjet est accessible de n'importe où dans le programme ainsi que sa méthode statutInitialisation().

    Donc à partir d'une autre classe (dans une autre fenêtre de dialogue) je tente d'appeler cette méthode de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "parametrage.h"
    #include "initialisation.h"
    #include "mainwindow.h"
     
     
    parametrage::parametrage(QWidget *parent)
        :QDialog(parent)
    {
        QString message = QString::fromStdString(MainWindow::m_initObjet->statutInitialisation());
        qDebug(message);
    }
    Et là, rien ne va plus, j'obtiens l'erreur ci-dessus. Il semblerait que l'objet ne soit plus accessible.

    Merci par avance pour votre point de vue éclairé.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 713
    Points : 2 361
    Points
    2 361
    Par défaut
    Bonjour.

    L'erreur est simple :
    MainWindow::m_initObjet->statutInitialisation() Cette syntaxe indique que m_initObjet est un membre static, ce qui n'est pas le cas.

    Donc soit tu récupère une instance de MainWindow, soit tu déclares m_initObjet comme statique, mais dans tous les cas la conception n'est pas optimale.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Merci pour cette réponse.

    En fait, je suis très intéressé par la fin de la réponse : "mais dans tous les cas la conception n'est pas optimale."

    J'entends par cela que le raisonnement que je fais n'est pas bon. Quelle voie faudrait-il plutôt que je suive ?

    Pour en revenir à la solution donnée, w du main représente l'instance de MainWindows. Mais je n'y ai pas accès, il est donné comme "non déclaré" à la compilation.

    Je vais aussi tenter une déclaration statique.

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 713
    Points : 2 361
    Points
    2 361
    Par défaut
    À priori la fenêtre principale ne devrait pas avoir la responsabilité de initialisation, mais que les deux objets devrait être géré à part (mais les autres te l'expliqueront mieux ).

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/08/2011, 09h22
  2. Réponses: 3
    Dernier message: 25/10/2008, 15h06
  3. erreur "Class A uses a non-entity class B
    Par bassim dans le forum JPA
    Réponses: 11
    Dernier message: 09/12/2007, 00h02
  4. [MySQL] Erreur : Non-static method DB::isManip()
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/09/2007, 15h37
  5. erreur: non-static variable
    Par semaj_james dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 15h56

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