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 :

Pointeur, attribut, et paramètre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Par défaut Pointeur, attribut, et paramètre
    Bonjour,

    Un n-ième problème de pointeur qui m'énerve depuis quelques heures:
    J'ai un objet dans ma fonction main (de type QApplication, mais ça ne change rien)
    J'ai besoin de créer une classe, dont les instances auront un attribut qui est... un pointeur vers le fameux objet créé dans main.
    J'ai donc besoin de passer le pointeur par paramètre (au constructeur, de préférence)

    J'ai essayé diverses combinaisons de * et de &, mais soit j'ai des erreurs de compilation, soit des erreurs de runtime (segmentation fault)

    Merci d'avance,
    ProgVal

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Je ne comprends pas trop ce qui te bloque ?
    C'est exactement comme tu l'as dis. Il faut passer le pointeur dans le constructeur :
    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
     
    class Machin
    {
    public:
       Machin():t_(NULL){} 
       Machin(Truc* t):t_(t){}
     
    private:
       Truc* t_;
    };
     
    int main()
    {
       // Truc sur le tas
       Truc* t1 = new Truc;
       Machin m1(t1);
     
      // ou Truc sur la pile (attention à la durée de vie de t2)
       Truc t2;
       Machin m2(&t2); 
    }
    Si tu te prends des segfault, cela veut probablement dire que tu essayes de déréférencer un pointeur non initialisé (et donc qui pointe au pif dans la mémoire) ou déréférencer un pointeur qui pointe sur objet qui n'est plus valide (attention à la durée de vie de tes objets)

  3. #3
    Membre très actif
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Par défaut
    J'ai déjà essayé ta solution

    Sur la ligne du constructeur sans paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: no matching function for call to ‘QApplication::QApplication()
    Cette ligne est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console::Console() : QObject()
    Il est à noter que ma classe (nommée Console) dérive de QObject

  4. #4
    Membre très actif
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Par défaut
    Bon, j'ai réglé le problème de l'erreur de compilation. Maintenant, j'ai un problème de "Segmentation fault" (problème de durée de vie?). Je signale que je suis sous Linux.
    Mon code actuel (réduit au strict nécessaire):
    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
    class Console : QObject
    {
        public:
            Console();
            Console(QApplication*);
        private:
            QApplication* app;
    };
     
    Console::Console() : QObject()
    {
    }
    Console::Console(QApplication *application) : app(application)
    {
        Console();
    }
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        Console maConsole(&app);
     
        return app.exec();
     
    }

  5. #5
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Citation Envoyé par ProgVal Voir le message
    Bon, j'ai réglé le problème de l'erreur de compilation. Maintenant, j'ai un problème de "Segmentation fault" (problème de durée de vie?). Je signale que je suis sous Linux.
    Mon code actuel (réduit au strict nécessaire):
    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
    class Console : QObject
    {
        public:
            Console();
            Console(QApplication*);
        private:
            QApplication* app;
    };
     
    Console::Console() : QObject()
    {
    }
    Console::Console(QApplication *application) : app(application)
    {
        Console();
    }
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        Console maConsole(&app);
     
        return app.exec();
     
    }
    Tu ne peux pas appeller ton propre constructeur dans une surcharge de ce constructeur. Le comportement est indéfini.

    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
     
    class Console : QObject
    {
        public:
            Console();
            Console(QApplication*);
        private:
            QApplication* app;
    };
     
    Console::Console() : QObject()
    {
    }
    Console::Console(QApplication *application) : 
       QObject(),
       app(application)
    {
    }
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        Console maConsole(&app);
     
        return app.exec();
     
    }

  6. #6
    Membre très actif
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Par défaut
    À quoi correspond le code que tu m'as donné? Parce qu'il génère une erreur de compilation

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/03/2009, 20h49
  2. Allocation dynamique (pointeur passé en paramètre)
    Par sperca dans le forum Débuter
    Réponses: 6
    Dernier message: 03/02/2009, 14h50
  3. Attributs des paramètres d'un CL ou RPG
    Par Arrnno dans le forum AS/400
    Réponses: 7
    Dernier message: 04/10/2008, 14h10
  4. Base pointeurs + passage de paramètre
    Par lyes312 dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2008, 22h47
  5. Pointeur d'un paramètre de fonction perdu
    Par solid360 dans le forum C
    Réponses: 3
    Dernier message: 07/12/2006, 01h00

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