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 :

Impossible d'appeler une méthode sans objet


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Impossible d'appeler une méthode sans objet
    Bonjour,

    je débute en C++, j'essaye donc de mettre en application ce que j’apprends sur les sites mais je bute sur un probleme depuis plusieurs jours.
    Je lis des valeurs dans un fichier ini pour venir modifier position et taille fenêtre principal en passant par une fonction, l'appel a cette fonction marche tres bien quand je l'appelle dans le mainwindow.cpp ligne 19 mais ne fonctionne plus dans le sous_prog.cpp ligne 57

    D:\hubic\Qt\Fenetre\testFenetre\sous_prog.cpp:57: erreur : cannot call member function 'void MainWindow::parametreFenetre(int, int, int, int)' without object

    un peu d'aide et d'explications serait le bienvenue
    merci d'avance


    mainwindow.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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
     
    namespace Ui
        {
        class MainWindow;
        }
     
    class MainWindow : public QMainWindow
        {
        Q_OBJECT
     
        public:
            explicit MainWindow(QWidget *parent = 0);
            ~MainWindow();
     
        public slots:
        void parametreFenetre(int posX, int posY, int taiX, int taiY);
     
        private:
            Ui::MainWindow *ui;
    };
     
    #endif // MAINWINDOW_H
    sous_prog.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef SOUS_PROG_H
    #define SOUS_PROG_H
     
    #include <Qstring>
    #include <string>
    using namespace std;
     
     
    void chargeIni();                           // Chargement fichier Ini
     
     
    #endif // SOUS_PROG_H
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mainwindow.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
     
        return a.exec();
    }
    mainwindow.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
    #include "QObject"
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    #include "sous_prog.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->label->setText(QCoreApplication::applicationDirPath()+"/infos.ini");
     
     
        chargeIni();
     
     
        parametreFenetre(50,50,320,200);
     
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
     
    void MainWindow::parametreFenetre(int posX, int posY, int taiX, int taiY)
        {
        this->setGeometry(posX , posY , taiX , taiY );
        }
    sous_prog.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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #include "QObject"
    #include "QCoreApplication"
    #include "QFileInfo"
    #include "QMessageBox"
    #include "QSettings"
     
    #include "sous_prog.h"
     
    #include "mainwindow.h"
    #include "sous_prog.h"
     
    #include <QBool>
    #include <string>
    #include <sstream>
    using namespace std;
     
     
    // ------------------------------------------------------------------------------------------------
    // ######################
    // # Charge Fichier Ini #
    // ######################
      void chargeIni()
        {
        QString cheminIni = (QCoreApplication::applicationDirPath()+"/infos.ini");
     
        if(!QFileInfo(cheminIni).exists())
            { // Fichier INI inexistant ---------------------------------------------------------------
            QMessageBox::information(NULL,"erreur","fichier INI non trouvé");
            // Nouveau fichier ------------------------------------------------------------------------
            QSettings settings(cheminIni, QSettings::IniFormat);
            settings.beginGroup("Fenetre");
              settings.beginGroup("Principal");
                settings.setValue("posX",68);
                settings.setValue("posY",37);
                settings.setValue("taiX",800);
                settings.setValue("taiY",590);
              settings.endGroup();
            settings.endGroup();
            QMessageBox::information(NULL,"Ini","Fichier crée");
            }
          else
            {// Fichier INI trouvé --------------------------------------------------------------------
            // Ouverture du fichier INI ---------------------------------------------------------------
            QSettings settings(cheminIni, QSettings::IniFormat);
            settings.beginGroup("Fenetre");                         // Ouverture du groupe 'Fenetre'
            settings.beginGroup("Principal");                       // Ouverture du groupe 'Principal'
                int posX = settings.value("posX",8).toInt();
                int posY = settings.value("posY",8).toInt();
                int taiX = settings.value("taiX",400).toInt();
                int taiY = settings.value("taiY",200).toInt();
            settings.endGroup();                                    // fermeture group 'Principal'
            settings.endGroup();                                    // fermeture group 'Fenetre'
     
     
     
           MainWindow::parametreFenetre(posX, posY, taiX, taiY);
     
     
     
     
     
          QMessageBox::information(NULL,"Ini","Trouvé");
     
     
     
            }
      }

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le compilateur est un sacré bavard, mais il est vachement sympa parce que, quand il rencontre un problème, il t'indique exactement ce que tu dois chercher et ou cela avant de s'arrêter. Le tout, c'est qu'il faut apprendre à comprendre ce qu'il te dit

    Dans le cas présent, il te dis, en gros, que tu ne peux pas faire appel à la fonction membre (de la classe MainWindow) parametreFenetre si tu ne dispose pas d'un objet de type MainWindow, ce qui est logique.

    Pas de bol, tu sembles avoir coupé ton fichier sous_prog.cpp avant la ligne 57, ce qui fait que l'on ne peut pas vraiment t'aider d'avantage, vu que l'on n'a aucune idée de ce que tu essaye de faire à cette ligne particulière (et de ce qui est fait les quelques lignes qui précèdent)

    Ensuite, quelques remarques en passant méritent d'être faites:

    1- Il n'y aura -- en théorie -- qu'une seule fenêtre principale à ton application : c'est la fenêtre qui prendra tout le reste en charge. Tu devrais veiller à ce que tout ce qu a trait à cette fenêtre se fasse au même endroit, et, surtout, à ce qu'il n'y ait qu'une seule possibilité d'aller y chipoter. Ce sera déjà bien assez compliqué ainsi

    2- Tu peux avoir des classes qui portent le même nom si elles font partie de projets différents. Mais j'ai l'impression que, dans le cas présent, tu travailles sur un seul et unique projet. Il faut donc veiller à ce que le nom de chacune de tes classes soit strictement unique, autrement, le compilateur ne va plus savoir à quel saint se vouer.

    3- Si tu débutes en C++, tu aurais sans doute largement intérêt à commencer par t'habituer au langage, et par essayer de te l'approprier correctement avant de passer à l'utilisation de bibliothèques externes comme Qt car elles ont bien souvent un fonctionnement qui leur est tout à fait particulier
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,

    désolé pas trop bien réveiller ce matin, j'ai pas vérifier avant de poster. J'ai donc corrigé le code dans le message de base

    Déjà merci de prendre le temps de répondre a mon post, pour répondre a tes trois points

    1 Oui, je n'ai qu'une seule fenêtre (défini dans le mainwindow) et ma fonction est bien défini dedans a la ligne 20 du mainwindow.h et 29 a 32 dans le mainwindow.cpp. l'appel que j'effectue ligne 19 du meme cpp fonctionne.
    2 Je suis bien sur un unique projet et je pense faire attention a utiliser des nom unique et sans équivoque afin de me retrouver facilement dans le code, mais quand je dit projet c'est beaucoup dire, je n'ai pas d'objectif final mais simplement le désir d'apprendre en me faisant des exemples concrets.
    3 Je me suis tourné vers Qt pensant que c’était un bon moyen de débuter ayant déjà programmer un peu en pascal avec Delphi, mais je reste friand de conseils si tu pense cela trop ardu pour commencer

    Merci

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Enalro Voir le message
    Bonsoir,


    1 Oui, je n'ai qu'une seule fenêtre (défini dans le mainwindow) et ma fonction est bien défini dedans a la ligne 20 du mainwindow.h et 29 a 32 dans le mainwindow.cpp. l'appel que j'effectue ligne 19 du meme cpp fonctionne.
    Parce que, dans mainwindow.cpp, l'appel de la fonction parametreFenetre se situe dans le constructeur de la classe MainWindow et que le constructeur d'une classe est -- à quelques particularités près -- une fonction membre de la classe "comme les autres", ce qui te permet donc de faire appel aux autres fonctions membres sans aucun problème (un peu comme si tu avais écrit un code proche dethis->parametreFenetre(50,50,320,200);, bien que ce ne soit surement pas une technique recommandée )

    Par contre, dans sous_prog.cpp, tu es dans une fonction libre (la fonction chargeIni() pour être précis), et, si tu veux faire appel à une fonction membre de la classe MainWindow, tu n'as pas beaucoup le choix: il faut le faire à partir... d'une variable de type MainWindow (*).
    2 Je suis bien sur un unique projet et je pense faire attention a utiliser des nom unique et sans équivoque afin de me retrouver facilement dans le code, mais quand je dit projet c'est beaucoup dire, je n'ai pas d'objectif final mais simplement le désir d'apprendre en me faisant des exemples concrets.
    C'est tout à ton honneur. Mais le C++ compte très clairement parmi les langages les plus complexes qui soient, pour toute une série de raisons qui font que c'est le cas.

    Et, pour ton malheur, si le fait d'avoir une première expérience dans un autre langage de programmation pourra t'éviter de "perdre du temps" à essayer de comprendre ce que sont les variables, structures conditionnelles, boucles et autre "types définis par l'utilisateur", il faut -- malgré tout -- prendre le temps d'assimiler un minimum la syntaxe et les spécificités du langage.

    Ce n'est pas particulièrement difficile, mais c'est un passage obligé pour n'importe quel langage de programmation
    3 Je me suis tourné vers Qt pensant que c’était un bon moyen de débuter ayant déjà programmer un peu en pascal avec Delphi, mais je reste friand de conseils si tu pense cela trop ardu pour commencer
    Tant que tu ne te sera pas approprié les bases du langage, oui, je crois que l'utilisation de Qt te passera par dessus la tête.

    Comme tu as déjà programmé dans un autre langage (qui, de plus, propose une orientation objets, si je ne m'abuse), il ne te faudra sans doute pas grand chose de plus, et ce n'est donc peut-être qu'une question de semaines ou de quelques mois avant que tu ne sois prêt à passer sur Qt, mais il faut vraiment prendre le temps de faire les choses correctement

    Et l'erreur à laquelle tu es confronté ici semble vraiment me donner raison

    EDIT (*) En fait, il y aurait bien une autre solution, mais, comme elle est inapplicable dans le cas présent, autant ne pas en parler
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    Juin 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Juin 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    re

    je m’aperçois que j'ai beaucoup de mal a comprendre ta réponse au point 1, je vais donc aller réviser le chapitre sur les classes.
    merci pour tes conseils.

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

Discussions similaires

  1. debutant java besoin d'aide
    Par aflex94 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 02/10/2008, 16h37
  2. Débutante ayant besoin d'aide pour une DB clients
    Par yauriane dans le forum Modélisation
    Réponses: 1
    Dernier message: 30/04/2008, 12h38
  3. Réponses: 4
    Dernier message: 28/05/2007, 17h48
  4. Debutant VB.net ayant besoin d'aide
    Par iLc00 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/07/2006, 23h47
  5. Debutant C++ besoin d'aide
    Par parp1 dans le forum Débuter
    Réponses: 4
    Dernier message: 21/02/2006, 22h19

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