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
    696
    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 : 696
    Points : 2 438
    Points
    2 438
    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.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  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
    696
    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 : 696
    Points : 2 438
    Points
    2 438
    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 ).
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

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