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:calim2:
pouvez vous m'expliquer? merci d'avance
Version imprimable
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:calim2:
pouvez vous m'expliquer? merci d'avance
Regarde sur les internets, il y a pleins d'explications ... mais je n'ai pas vu de cours sur developpez.net :weird:
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 :mrgreen:
Comme c'est 1 déclaration, tu n'as pas "le corps", juste l'"entête" :
Cela permet de dire au compilateur de patienter qu'il y a 1 type/ 1 fonction qui sera défini après son utilisation :mrgreen:Code:
1
2
3
4 // Forward Declarations struct s_XXX; class myClass; XXX func(/* ... */);
Le plus proche est cette entrée de FAQ
https://cpp.developpez.com/faq/cpp/?...-une-a-l-autre
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.:oops::D
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 Pièce jointe 592981
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).
ok je vais voir pour reglée ca
merci
bonjour
j'ai fait ca mais je ne comprend pas pourquoi ca ne marche pas
Code:
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:
re donc on a ces forward declaration qui ne fonctionne pas voici les code:
Code:
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:
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
voila si vous voyer le problème je suis preneurCode:
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
Bonjour,
Sors ces déclarations des définitions des classes serveurprimaire et MainWindow pour les mettre avant :
Code:
1
2
3
4
5structclass seveursecondaire; class serveurprimaire : public MainWindow { ...
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.Code:
1
2
3
4
5
6structclass serveurprimaire;structclass seveursecondaire; class MainWindow : public QMainWindow { ...
bonjour quand je fais ça je me prends unps désolé de ne pas vous avoir répondu plus tôtCitation:
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
Ah effectivement j'avais pas prêté attention à ceci. C'est corrigé dans mon message précédent.
bonjour j'ai encore les erreur précédentes:aie: : Pièce jointe 593765
quelle bout de code je peut vous fournir pour que nous arrivions a résoudre le problème
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:
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:
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);
vous voyer l'erreur ? :(:?Code:
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);
il vous faut plus de code ?
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é.
bonjour voici mes slot
et les erreur :Code:
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; }
Code:
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
Ton message d'erreur est très loin d'être complet.
Elle est là ton erreur :
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.
avec ca :ne change rien...:calim2::calim2:Code:connect(primarySocket, &QTcpSocket::errorOccurred, this, &serveurprimaire::Socketerror);
:cristal:
peut-être que vous trouverez un peu plus là-dedans :
mais je ne vois pas où il y a une erreur:ptdr::aie:Citation:
15:43:06: Exécution des étapes pour le projet client...
15:43:06: Configuration inchangée, étape qmake sautée.
15:43:06: Débute : "C:\Qt\Tools\mingw810_64\bin\mingw32-make.exe" -j4
C:/Qt/Tools/mingw810_64/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/Users/eneep/Documents/clef/chat/creation/test/client/build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug'
g++ -c -fno-keep-inline-dllexport -g -std=gnu++1z -Wall -Wextra -Wextra -fexceptions -mthreads -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../../../4.0/client/client -I. -IC:/Qt/6.0.1/mingw81_64/include -IC:/Qt/6.0.1/mingw81_64/include/QtWidgets -IC:/Qt/6.0.1/mingw81_64/include/QtGui -IC:/Qt/6.0.1/mingw81_64/include/QtNetwork -IC:/Qt/6.0.1/mingw81_64/include/QtCore -Idebug -I. -IC:/VulkanSDK/1.0.51.0/Include -IC:/Qt/6.0.1/mingw81_64/mkspecs/win32-g++ -o debug\serveurprimaire.o ..\..\..\4.0\client\client\serveurprimaire.cpp
g++ -c -fno-keep-inline-dllexport -g -std=gnu++1z -Wall -Wextra -Wextra -fexceptions -mthreads -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../../../4.0/client/client -I. -IC:/Qt/6.0.1/mingw81_64/include -IC:/Qt/6.0.1/mingw81_64/include/QtWidgets -IC:/Qt/6.0.1/mingw81_64/include/QtGui -IC:/Qt/6.0.1/mingw81_64/include/QtNetwork -IC:/Qt/6.0.1/mingw81_64/include/QtCore -Idebug -I. -IC:/VulkanSDK/1.0.51.0/Include -IC:/Qt/6.0.1/mingw81_64/mkspecs/win32-g++ -o debug\seveursecondaire.o ..\..\..\4.0\client\client\seveursecondaire.cpp
g++ -Wl,-subsystem,windows -mthreads -o debug\client.exe debug/main.o debug/mainwindow.o debug/serveurprimaire.o debug/seveursecondaire.o debug/moc_mainwindow.o debug/moc_serveurprimaire.o C:\Qt\6.0.1\mingw81_64\lib\libQt6Widgets.a C:\Qt\6.0.1\mingw81_64\lib\libQt6Gui.a C:\Qt\6.0.1\mingw81_64\lib\libQt6Network.a C:\Qt\6.0.1\mingw81_64\lib\libQt6Core.a -lmingw32 C:\Qt\6.0.1\mingw81_64\lib\libQt6EntryPoint.a -lshell32
debug/mainwindow.o: In function `MainWindow::on_conectbuton_clicked()':
C:\Users\eneep\Documents\clef\chat\creation\test\client\build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug/../../../4.0/client/client/mainwindow.cpp:24: undefined reference to `MainWindow::conect(QString, int)'
debug/mainwindow.o: In function `MainWindow::on_sentbuton_clicked()':
C:\Users\eneep\Documents\clef\chat\creation\test\client\build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug/../../../4.0/client/client/mainwindow.cpp:34: undefined reference to `MainWindow::sent(QString)'
debug/serveurprimaire.o: In function `serveurprimaire::executerequest(QString)':
C:\Users\eneep\Documents\clef\chat\creation\test\client\build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug/../../../4.0/client/client/serveurprimaire.cpp:148: undefined reference to `serveurprimaire::conectsecondary(QString, int)'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [Makefile.Debug:82: debug/client.exe] Error 1
mingw32-make: *** [Makefile:45: debug] Error 2
mingw32-make[1]: Leaving directory 'C:/Users/eneep/Documents/clef/chat/creation/test/client/build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug'
15:43:09: Le processus "C:\Qt\Tools\mingw810_64\bin\mingw32-make.exe" s'est terminé avec le code 2.
Erreur lors de la compilation/déploiement du projet client (kit : Desktop Qt 6.0.1 MinGW 64-bit)
When executing step "Make"
15:43:09: Elapsed time: 00:03.
Visiblement, tu n'as pas implémenté ces fonctions.Citation:
C:\Users\eneep\Documents\clef\chat\creation\test\client\build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug/../../../4.0/client/client/mainwindow.cpp:24: undefined reference to `MainWindow::conect(QString, int)'
debug/mainwindow.o: In function `MainWindow::on_sentbuton_clicked()':
C:\Users\eneep\Documents\clef\chat\creation\test\client\build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug/../../../4.0/client/client/mainwindow.cpp:34: undefined reference to `MainWindow::sent(QString)'
debug/serveurprimaire.o: In function `serveurprimaire::executerequest(QString)':
C:\Users\eneep\Documents\clef\chat\creation\test\client\build-client-Desktop_Qt_6_0_1_MinGW_64_bit-Debug/../../../4.0/client/client/serveurprimaire.cpp:148: undefined reference to `serveurprimaire::conectsecondary(QString, int)'
voici connect
voici sentCode:
1
2
3
4 void serveurprimaire::conect(QString ip, int port) { primarySocket->connectToHost(ip,port); }
voici conect secondary :Code:
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 void seveursecondaire::sent(QString message) { QString heurs = QDateTime::currentDateTime().toString("hh:mm:ss"); QString Date = QDateTime::currentDateTime().toString("ddd dd MMM yyyy"); QDateTime::fromString(heurs, "hh:mm:ss"); QByteArray paquet; QDataStream out(&paquet, QIODevice::WriteOnly); // On pr?pare le paquet ? envoyer QString messageAEnvoyer = tr("<strong><i>le ") + Date + tr(" a ") +heurs + tr(" ") /*+ ui->pseudo->text() +tr("</i></strong> : ")*/ + message + tr(" <br />"); out << (quint16) 0; out << messageAEnvoyer; out.device()->seek(0); out << (quint16) (paquet.size() - sizeof(quint16)); secondarySocket->write(paquet); // On envoie le paquet //ui->message->clear(); // On vide la zone d'?criture du message //ui->message->setFocus(); // Et on remet le curseur ? l'int?rieur }
apres j'ai deux classe serveur primaire et serveur secondaire. il ont les meme nom de fonction : serveurprimaire::sent(QString message) et serveursecondaire::sent(QString message)Code:
1
2
3
4 void seveursecondaire::conectsecondary(QString ip, int port) { secondarySocket->connectToHost(ip,port); }
peut etre que c'est ca qui pose problème ?
Non, là tu ne fais que déclarer les fonctions membre. Pas les implémenter.
je dois paraitre bête :aie::mouarf: mais c'est a dire implémenter ?
[Suite à l'édition de ton message…]
Oui ça ce sont les implémentations, qu'il te reste à faire pour les fonctions membres mentionnées dans le message d'erreur.
veut tu une autre partie du code