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 :

Comment utiliser des références dans un constructeur ?

  1. #1
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut Comment utiliser des références dans un constructeur ?
    Bonjour,
    j'ai trois classes : une classe de serveur(avec une ui), une classe de paramètre (avec une ui) et une classe pour faire des supressions (avec un ui) de messages enregistrés dans la classe serveur.
    La classe de suppression ne peut être lancée que à partir de la classe de paramètre et la classe paramètre ne peut être lancée que depuis la classe serveur.
    Donc ma référence devrait avoir un chemin un peu long.

    Dans le constructeur de paramètre je demande donc un pointeur vers ma liste de messages. De même avec le constructeur de la classe de suppression.
    Voici le code :

    parametre.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     explicit parametre(QList<QMap<QString, QString> > &ref, QWidget *parent = nullptr);
    parametre.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     parametre::parametre(QList<QMap<QString,QString>> &ref,QWidget *parent) :
        QDialog(parent),
        ui(new Ui::parametre)
    {
        remouveFile remouveFiles(ref,this);
        ui->setupUi(this);
    ... le constructeur continu ...
    remouvefile.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explicit remouveFile(QList<QMap<QString, QString> > &ref, QWidget *parent = nullptr);
    remouvefile.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    remouveFile::remouveFile(QList<QMap<QString, QString> > &ref, QWidget *parent) :
        QDialog(parent),
        ui(new Ui::remouveFile)
    {
        ui->setupUi(this);
        ui->TextLabeldisplayingNumberDessage->setText("<html><head/><body><p align=\"center\"><span style=\" font-size:14pt;\">il y a "+QString::number(ref.size())+" message</span></p></body></html>");
        ui->spinBoxNumberMessage->setMaximum(ref.size());
    }
    Voilà sauf que si je met que ça dans la creation des object par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    parametre::parametre(QList<QMap<QString,QString>> &ref,QWidget *parent) :
        QDialog(parent),
        ui(new Ui::parametre)
    {
        remouveFile remouveFiles(ref,this);
    il y a une erreur : erreur : constructor for 'parametre' must explicitly initialize the member 'remouveFiles' which does not have a default constructor
    alors que tous les arguments possible sont rentrés.
    Savez-vous d'où vient mon problème ?

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    L'erreur t'indiques que tu as un membre de parametre appelé remouveFiles qui n'est pas initialisé dans la liste d'initialisation.
    Tu crées une variable de même nom dans le constructeur, il ne faut pas les confondre.
    ton constructeur de devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     parametre::parametre(QList<QMap<QString,QString>> &ref,QWidget *parent) :
        QDialog(parent),
        ui(new Ui::parametre),
        remouveFiles(ref,this)
    {
        ui->setupUi(this);
        ...

  3. #3
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut
    bonjour cella fonctionne tres bien, avec une petite subtilité : il faut initialiser l'ui apres la classe sinon on a cette erreur :avertissement : field 'ui' will be initialized after field 'remouveFiles'


    mais avant de résoudre le sujet je voudrais juste savoir si il y a un moyen a la ligne 6 de remouvefile.cpp d'afficher dynamiquement le nombre de message dans le label?
    merci d'avance.

  4. #4
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut
    Bonjour pour l'instant il met impossible d'afficher le nombre de messages je me prend une erreur lorsque j'apel la fonction size()

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Citation Envoyé par eneediorio Voir le message
    Bonjour pour l'instant il met impossible d'afficher le nombre de messages je me prend une erreur lorsque j'apel la fonction size()
    Bonjour,
    Tu ne précises pas l'erreur, ni même si c'est une erreur à la compilation ou lors de l'exécution, donc difficile de te répondre précisément. Et j'ai un problème de compréhension de ta phrase. Est-ce :
    - ... il met "impossible de d'afficher ..." ... (le verbe mettre)
    - ou ... il m'est impossible d'afficher ... (le verbe être) ?

    Il y a dans ton code quelque chose qui ne peut pas marcher.
    remouveFiles est un membre de parametre. Or un objet ne peut exister qu'après la construction de tous ses membres. Donc remouveFiles est forcément construit avant parametre.
    remouveFiles semble gérer une fenêtre fille de la fenêtre gérée par parametre. Donc on se retrouve à créer la fille avant de créer sa mère. Ce qui ne peut pas fonctionner!

    Pour corriger, on peut :
    - créer la fille sans parent, puis dans de constructeur de parametre le définir comme le nouveau parent;
    - ou faire que la fenêtre associée à remouveFiles soit créée dans le constructeur de parametre.
    Pour le second cas, on peut passer par un pointeur intermédiaire qui sera membre, et le pointé sera créé 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
    class parametre {
        ....
        std::unique_ptr<LeTypeDeRemouveFiles>>  p_remove_files;  // remplace remouveFiles
        ....
    };
     
    parametre::parametre( QList<QMap<QString,QString>>& ref, QWidget* parent ) :
        QDialog( parent ),
        ui( new Ui::parametre )
    {
        ui->setupUi( this );
        ....
        // et à la fin du constructeur
        // la mère est créée et initialisée, on peut créer la fille sans risque
        p_remove_files = std::make_unique<LeTypeDeRemouveFiles>( ref, this ); // fille créée (elle peut utiliser *this qui est construit)
        // à partir de cet instant, on a créé la fille, on a alors   (*p_remove_files) <==> remouveFiles
    }

  6. #6
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    La tout les fenêtres marche très bien mais j'ai juste un problème : dans remouvefile il y a un widget qui affiche le nombre de messages actuelle et un bouton pour supprimer 10 ou tout les messages mais je ne sait pas comment faire pour que le widget sactualise en même temps que l'arivée d'un nouveau message actuellement dans le constructeur je m'est widget->settext(réf.size()) mais vue que c'est dans le constructeur ça fonctionne pas il affiche une fois 0.
    Et c'est pas vraiment une erreur c'est plus le compilateur qui me pointe un problème dans QListe directement.
    Il y a dans ton code quelque chose qui ne peut pas marcher.
    remouveFiles est un membre de parametre. Or un objet ne peut exister qu'après la construction de tous ses membres. Donc remouveFiles est forcément construit avant parametre.
    remouveFiles semble gérer une fenêtre fille de la fenêtre gérée par parametre. Donc on se retrouve à créer la fille avant de créer sa mère. Ce qui ne peut pas fonctionner!
    je ne comprends pas chez moi ça fonctionne très bien je le ferai tout de même dès que je vais sur mon pc

  7. #7
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut
    l'erreur ce situe a la lige 115 de QList.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       inline int size() const noexcept { return int(d->end - d->begin); }   // q6sizetype
    c'est une erreur a la compilation.
    le code qui génère l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->deleteNMessage->setMaximum(listeOfMessage->size());

  8. #8
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut
    bonjour je n'arrive pas a savoir comment on fait
    Pour corriger, on peut :
    - créer la fille sans parent, puis dans de constructeur de parametre le définir comme le nouveau parent;
    - ou faire que la fenêtre associée à remouveFiles soit créée dans le constructeur de parametre.
    Pour le second cas, on peut passer par un pointeur intermédiaire qui sera membre, et le pointé sera créé dans le constructeur.

  9. #9
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Citation Envoyé par eneediorio Voir le message
    l'erreur ce situe a la lige 115 de QList.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       inline int size() const noexcept { return int(d->end - d->begin); }   // q6sizetype
    c'est une erreur a la compilation.
    le code qui génère l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ui->deleteNMessage->setMaximum(listeOfMessage->size());
    Si c'est une erreur de compilation, il doit y avoir un texte qui commente cette erreur (et il doit être sur plusieurs lignes). Avec un simple extrait et aucune info sur l'erreur, difficile d'indiquer quoi que ce soit. C'est peut-être lié au type de données qui sont dans listeOfMeassage.
    Citation Envoyé par eneediorio Voir le message
    bonjour je n'arrive pas a savoir comment on fait
    ...
    Pour la première manière, je ne connais pas assez Qt pour te donner un exemple.
    Pour la seconde, je t'ai donné un exemple. As-tu essayé?

  10. #10
    Membre à l'essai
    Homme Profil pro
    programmation
    Inscrit en
    Janvier 2020
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : programmation

    Informations forums :
    Inscription : Janvier 2020
    Messages : 69
    Points : 16
    Points
    16
    Par défaut
    bonjour l'ai enfin trouvé il suffisait d'initialiser nullpt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       remouveFiles(ref,nullptr),
    ...
    {
        remouveFile remouveFiles(ref,nullptr);
       ...
    mais maintenait petit problème : j'affiche la taille de la liste dans le constructeur.
    mais cella ne s'actualise évidement pas a chaque fois qu'un nouveaux message rentre dans la liste.
    il faudrait soit que je réussis a connecter le fenetre.show a une fonction (je ne sait pas si il y a un signal qui est émis.
    ou que j'utilise un moyen d'afficher dynamiquement le nombre de ligne

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

Discussions similaires

  1. Comment utiliser des dll C++ dans un projet C# ?
    Par kreitech dans le forum C#
    Réponses: 5
    Dernier message: 20/02/2007, 16h49
  2. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  3. Réponses: 6
    Dernier message: 22/05/2006, 13h54
  4. Comment utiliser des instructions SSE2 dans un code c++?
    Par alexIsBack dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 22/02/2006, 19h10
  5. [C#] Comment utiliser des dll win 32 dans un projet .NET
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 31/05/2005, 13h45

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