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 :

comment utiliser la forward declaration ?


Sujet :

C++

  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 la forward declaration ?
    bonjour
    cella fait pas mal de temps que j'ai besoin d'utiliser la forward declarations mais petit problème je ne sait pas faire
    pouvez vous m'expliquer? merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Regarde sur les internets, il y a pleins d'explications ... mais je n'ai pas vu de cours sur developpez.net

    C'est lorsque tu veux soit définir/ utiliser 1 variable (et non pas 1 pointeur) ou créer 1 container d'1 type que tu as créé (struct ou class) soit appeler 1 fonction, mais que ce type et/ou cette fonction n'a pas encore été défini.

    Tu ne veux pas faire d'include définissant ce type/ cette fonction (parce que) ou alors tu ne peux pas faire d'include (à cause des includes circulaires) - alors la solution c'est la déclaration anticipée

    Comme c'est 1 déclaration, tu n'as pas "le corps", juste l'"entête" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Forward Declarations
    struct s_XXX;
    class myClass;
    XXX func(/* ... */);
    Cela permet de dire au compilateur de patienter qu'il y a 1 type/ 1 fonction qui sera défini après son utilisation

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Le plus proche est cette entrée de FAQ
    https://cpp.developpez.com/faq/cpp/?...-une-a-l-autre
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  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 merci pour vautre aide je penser que la forward declarations fonctionnée comme l'héritage mais non il faut inclure uniquement les fonction d'on on a besoin
    merci ca doit faire un mois que je cherche.

  5. #5
    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 reviens vers vous pour vous montrée des erreur que je me prend a la compilation je pense que c'est lier a la forward declaration voici une capture d'écran des problème Nom : Capture.PNG
Affichages : 424
Taille : 51,2 Ko

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Vous ne passez pas assez de paramètres à votre slot. Il indique que le signal et le slot ne sont pas compatibles (en nombres de paramètres).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  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
    ok je vais voir pour reglée ca
    merci

  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
    j'ai fait ca mais je ne comprend pas pourquoi ca ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class serveurprimaire : public MainWindow
    {
        struct seveursecondaire;
        seveursecondaire* conectsecondary(QString ip, int port);
        Q_OBJECT
    public:
        serveurprimaire();
    public slots:

  9. #9
    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
    re donc on a ces forward declaration qui ne fonctionne pas voici les code:
    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
    #ifndef SERVEURPRIMAIRE_H
    #define SERVEURPRIMAIRE_H
    #include <QString>
    #include <QDateTime>
    #include <QTcpSocket>
    #include <QMessageBox>
    #include "mainwindow.h"
     
    //#include <QSound>-
    class serveurprimaire : public MainWindow
    {
        struct seveursecondaire;
        seveursecondaire* conectsecondary(QString ip, int port);
        Q_OBJECT
    public:
        serveurprimaire();
    public slots:
        void conect(QString ip, int port);
    private slots:
        //fonctionement vitale du serveur
        void connected();
        void desconected();
        void Socketerror(QAbstractSocket::SocketError erreur);
        //fonctionement utilitaire du serveur
        void datarecevied();
        void sent(QString message);
        void executerequest(QString request);
    private:
        quint16 tailleMessage;
        QTcpSocket *primarySocket; // Représente le serveur primaire
    };
     
    #endif // SERVEURPRIMAIRE_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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <string>
     
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
     
    class MainWindow : public QMainWindow
    {
        struct serveurprimaire;
        struct seveursecondaire;
        Q_OBJECT
    public:
        seveursecondaire* sent(QString message);
        serveurprimaire* conect(QString ip, int port);
        Ui::MainWindow *ui;
     
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
     
    public slots:
        void playsound();
        void flash();
        void appendmessagelist(QString message);
        void conectLabelSetText(QString text);
        QString seepsedo();
     
     
    private slots:
        void chatbot(QString request);
        void on_conectbuton_clicked();
        void on_sentbuton_clicked();
        void on_notificationsonore_clicked(bool checked);
        void on_notificationvisuelle_clicked(bool checked);
    };
    #endif // 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
    #ifndef SEVEURSECONDAIRE_H
    #define SEVEURSECONDAIRE_H
    #include "serveurprimaire.h"
     
    class seveursecondaire : public serveurprimaire
    {
     
    public:
        seveursecondaire();
    public slots:
         void sent(QString message);
         void conectsecondary(QString ip, int port);
    private slots:
        //fonctionement vitale du serveur
        void connected();
        void desconected();
        void Socketerror(QAbstractSocket::SocketError erreur);
        //fonctionement utilitaire du serveur
        void datarecevied();
    private:
        QTcpSocket *secondarySocket; // Représente le serveur secondaire
        quint16 tailleMessage;
    };
     
    #endif // SEVEURSECONDAIRE_H
    voila si vous voyer le problème je suis preneur

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par eneediorio Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class serveurprimaire : public MainWindow
    {
        struct seveursecondaire;
        ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MainWindow : public QMainWindow
    {
        struct serveurprimaire;
        struct seveursecondaire;
        ...
    Sors ces déclarations des définitions des classes serveurprimaire et MainWindow pour les mettre avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    structclass seveursecondaire;
    
    class serveurprimaire : public MainWindow
    {
        ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    structclass serveurprimaire;
    structclass seveursecondaire;
    
    class MainWindow : public QMainWindow
    {
        ...
    Sinon là, tu déclares deux classes imbriquées serveurprimaire::seveursecondaire et MainWindow::seveursecondaire indépendantes de la troisième que tu définis dans l'espace global.
    Dernière modification par Invité ; 18/03/2021 à 13h12.

  11. #11
    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 quand je fais ça je me prends un
    warning serveurprimaire.h:12: avertissement : 'serveurprimaire' defined as a class here but previously declared as a struct; this is valid, but may result in linker errors under the Microsoft C++ ABI
    ps désolé de ne pas vous avoir répondu plus tôt

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ah effectivement j'avais pas prêté attention à ceci. C'est corrigé dans mon message précédent.

  13. #13
    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 j'ai encore les erreur précédentes : Nom : Capture.PNG
Affichages : 329
Taille : 20,1 Ko
    quelle bout de code je peut vous fournir pour que nous arrivions a résoudre le problème

  14. #14
    Invité
    Invité(e)
    Par défaut
    Comme te l'a déjà dit LittleWhite et te le suggère le message d'erreur, les paramètres passés par le signal ne sont pas compatibles avec celui du slot auquel tu le connect()es.
    Cf. ce sujet pour mieux comprendre.

  15. #15
    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
    oui mais normalement il me dit ou sont les erreur (un numéro de ligne)
    je ne trouve pas ou son les erreur… help me
    voici mes code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class serveurprimaire;
    class seveursecondaire;
     
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
     
    class MainWindow : public QMainWindow
    {
     
        Q_OBJECT
    public:
        seveursecondaire* sent(QString message);
        serveurprimaire* conect(QString ip, int port);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class seveursecondaire;
     
    //#include <QSound>-
    class serveurprimaire : public MainWindow
    {
     
     
        Q_OBJECT
    public:
        seveursecondaire* conectsecondary(QString ip, int port);
        serveurprimaire();
    public slots:
        void conect(QString ip, int port);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class seveursecondaire : public serveurprimaire
    {
     
    public:
        seveursecondaire();
    public slots:
         void sent(QString message);
         void conectsecondary(QString ip, int port);
    vous voyer l'erreur ?
    il vous faut plus de code ?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Si tu as bien décortiqué nos messages et mon lien, tu devrais maintenant savoir que l'erreur se situe sur la connexion entre un signal et un slot. Or je ne vois rien de tel dans ce que tu montres .
    Et pour avoir toutes les infos sur l'erreur de compilation, regarde plutôt l'onglet 4 Sortie de compilation. Le 1er 1 Problèmes n'est qu'un bref résumé.

  17. #17
    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 voici mes slot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "serveurprimaire.h"
     
    serveurprimaire::serveurprimaire()
    {
        connect(primarySocket, &QTcpSocket::readyRead,this,&serveurprimaire::datarecevied);
        connect(primarySocket, &QTcpSocket::connected,this,&serveurprimaire::connected);
        connect(primarySocket, &QTcpSocket::disconnected,this,&serveurprimaire::desconected);
        connect(primarySocket, &QTcpSocket::error, this, &serveurprimaire::Socketerror);
        tailleMessage = 0;
    }
    et les erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    In file included from C:/Qt/6.0.1/mingw81_64/include/QtCore/qobjectdefs.h:49,
                     from C:/Qt/6.0.1/mingw81_64/include/QtCore/qmetatype.h:54,
                     from C:/Qt/6.0.1/mingw81_64/include/QtCore/qvariant.h:46,
                     from C:/Qt/6.0.1/mingw81_64/include/QtCore/qlocale.h:43,
                     from C:/Qt/6.0.1/mingw81_64/include/QtCore/qcalendar.h:46,
                     from C:/Qt/6.0.1/mingw81_64/include/QtCore/qdatetime.h:47,
                     from C:/Qt/6.0.1/mingw81_64/include/QtCore/QDateTime:1,
                     from ..\..\..\4.0\client\client\serveurprimaire.h:4,
                     from ..\..\..\4.0\client\client\serveurprimaire.cpp:1:
    C:/Qt/6.0.1/mingw81_64/include/QtCore/qobjectdefs_impl.h: In instantiation of

  18. #18
    Invité
    Invité(e)
    Par défaut
    Ton message d'erreur est très loin d'être complet.

    Elle est là ton erreur :
    Citation Envoyé par eneediorio Voir le message
    Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(primarySocket, &QTcpSocket::error, this, &serveurprimaire::Socketerror);
    QTcpSocket::error n'est pas un signal, et ne fournit pas non plus de paramètre QAbstractSocket::SocketError attendu par serveurprimaire::Socketerror.

    C'est void errorOccurred(QAbstractSocket::SocketError socketError) que tu cherches.

  19. #19
    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
    avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        connect(primarySocket, &QTcpSocket::errorOccurred, this, &serveurprimaire::Socketerror);
    ne change rien...

  20. #20
    Invité
    Invité(e)
    Par défaut

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. Réponses: 6
    Dernier message: 22/05/2006, 13h54
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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