C++:Probleme Compilation, class non definie

Fermé
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 - 29 janv. 2009 à 16:56
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 - 30 juin 2011 à 13:02
Hello! C'est pas trop mon genre de poser des questions, je prefer me débrouiller mais la, je vois
vraiment pas ce qui merde dans mon code, donc j'espère que vous pourez m'aider...

Voilà le code qui foire: (j'utilise la librairie Qt)

#ifndef CLIENT
#define CLIENT


#include <QtGui>
#include <QtNetwork>

#include "Ds2fen.h"
#include "Comm.h"
#include "Chatwid.h"
#include "Packet.h"
#include "Client.h"
#include <QTcpSocket>
#include <QStandardItem>
#include <QDataStream>

class Client : public QStandardItem, public QObject
{
Q_OBJECT

public:
Client(QTcpSocket *cli, Comm *par);


public slots:
void inComing();
void send(Packet pac);

signals:
void fullPacket(Packet *pac);

private:
QTcpSocket *clientSocket;
Comm *parent;
QDataStream in_out(clientSocket);
quint16 messLength;

};

#endif


et il me sort comme erreur:

Client.h:22: error: `Comm' has not been declared
Client.h:22: error: ISO C++ forbids declaration of `par' with no type
Client.h:27: error: variable or field `send' declared void
Client.h:27: error: expected `;' before '(' token
Client.h:30: error: variable or field `fullPacket' declared void
Client.h:30: error: expected `;' before '(' token
Client.h:34: error: ISO C++ forbids declaration of `Comm' with no type
Client.h:34: error: expected `;' before '*' token
Client.h:35: error: expected `;' before '(' token


Merci d'avance!

12 réponses

Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
29 janv. 2009 à 20:49
voici le Comm en question:

#ifndef COMM
#define COMM

#include "Ds2fen.h"
#include "Comm.h"
#include "Chatwid.h"
#include "Packet.h"
#include "Client.h"
#include <QString>
#include <QTcpServer>
#include <QTcpSocket>
#include <QObject>
#include <QList>
#include <QStandardItemModel>

class Comm : public QObject
{
Q_OBJECT


public:

//constructeur
Comm(QObject parent ,bool server = false , QString defIp = "127.0.0.1", int defPort = 4444);

//
void setServer(bool set);
void setIp(QString newip);
void setIp(int prim, int sec, int ters, int quat);
void setport(int newport);


//accesseurs
bool isServer();
QString getIp();
int getport();

//destructeur

private:

QObject *stockParent;
int port;
QString ip;
bool server;
QTcpServer *serverSocket;
QTcpSocket *clientSocket;
QStandardItemModel* clients;
Client cli;

public slots:

void getNewConnection();
void newPacket(Packet *pac);

signals:
void sendMessage(Packet *);


};

#endif


P.S: je sais pour les includes de Qt, j'ai oublier de rectifier après avoir tester ce que cela donnais =)
2
Je ne vois pas franchement une erreur.

1ère remarque:
Il faudrait simplifier le code.
Pourquoi déclarer un "#include <Comm.h>" dans le fichier "comm.h" ? Inutile même si normalement cela ne devrait pas entraîner une erreur.
Pourquoi déclarer:
- #include "Ds2fen.h"
- #include "Chatwid.h"
- #include "Packet.h"
- #include "Client.h"
A quoi cela sert-il ?
Bien sûr on peut déclarer des includes qui ne servent à rien, mais cela rallonge le temps de compilation.

2ème remarque:
Je suis perplexe en analysant les erreurs de compilation.
- "Client.h:22: error: `Comm' has not been declared"
Ligne 22: bon à 2 ou 3 lignes près, c'est correct.
- "Client.h:27: error: variable or field `send' declared void"
Je ne trouve pas de 'send' même à 2 ou 3 lignes près.
Je m'arrête et je me demande s'il n'y aurait pas un fichier parasite de même nom "comm.h" ou alors il y a appel à un autre include qui utilise la classe "Comm" mais sans appel à "Comm.h".
A suivre.
0
kill4m Messages postés 224 Date d'inscription jeudi 12 juin 2008 Statut Membre Dernière intervention 28 janvier 2012 26
29 janv. 2009 à 16:58
Certainement l'odre des inclusion.
essaye de placer sa au début :
#include <QTcpSocket>
#include <QStandardItem>
#include <QDataStream>

sinon regarde ou est définit "Comm' et place cette nclude avant les autres.
0
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
29 janv. 2009 à 17:54
non, sa change rien =S vraiment bizard...
0
Le compilateur est clair: il ne sait pas ce qu'est 'Comm'.
Comme je suppose que Comm est défini dans comm.h, c'est donc que ce fichier n'est pas lu comme on le voudrait (s'il ne le trouvait pas il le dirait, donc il le trouve). Qu'y a-t-il donc dans ce fichier qui empêche de définir Comm?
Nota:
#include <QTcpSocket> est inutile car pris en compte dans "<#include <QtNetwork>"
#include <QStandardItem> est inutile car pris en compte dans "#include <QtGui>"
Si tu ne trouves pas, donne-nous comm.h.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
29 janv. 2009 à 23:16
pour le send, cela fait aussi parti des erreurs bizard, c'est l'un des slots déclaré, mais le compilateur ne l'accepte pas,
à croire que qmake fait dl'a marde...

c'est cette ligne là:
void send(Packet pac);

Pour le comm, je l'ai renomer, j'ai verifier le dossier, aucun doute sur le fichier... très bizard.

C'est possible que ce soi une erreur dans la création du makefile? que qmake fasse des truks zarbs?

sinon pour les includes, ils n'etaitent pas tous là à l'origine, mais après avoir passé 2h à essayer de resoudre ce genre de probleme, on tente un peu tout et n'importe quoi...
0
"void send(Packet pac); "
Mais je ne vois pas cette ligne dans le fichier que tu as posté!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
30 janv. 2009 à 00:43
Salut,
As-tu bien pensé à configurer ton fichier .pro ? Il faut mettre :
QT += network

N'oublie pas de régénérer le Makefile ;)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 janv. 2009 à 08:54
Salut.
Je ne comprend pas tes messages de compilation. As tu mis le début ? Tu essai de compiler client.h ???
Essai de déclarer ta classe (class Comm;) juste avant ta classe Client.
Autre chose à vérifier, passe juste un coup de préprocesseur ton fichier et regarde si il n'y a pas un problème de #define (gcc -E).
Essai d'utiliser Comm dans un fichier plus simple.
0
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
30 janv. 2009 à 16:55
loupius,

class Client : public QStandardItem, public QObject
{
Q_OBJECT

public:
Client(QTcpSocket *cli, Comm *par);


public slots:
void inComing();
void send(Packet pac); <- La ligne est ici...



voilà le message complet du compilo (c'est un peu de charabia pour moi ^^)

mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/Users/dark-san/Documents/C_C++/chatvercp
lusplus'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_DLL -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEE
DS_QMAIN -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\4.4.3\include\QtCore" -I"c:\Qt\
4.4.3\include\QtNetwork" -I"c:\Qt\4.4.3\include\QtNetwork" -I"c:\Qt\4.4.3\includ
e\QtGui" -I"c:\Qt\4.4.3\include\QtGui" -I"c:\Qt\4.4.3\include" -I"." -I"c:\Qt\4.
4.3\include\ActiveQt" -I"debug" -I"." -I"c:\Qt\4.4.3\mkspecs\win32-g++" -o debug
\Chatwid.o Chatwid.cpp
In file included from Packet.h:12,
from Chatwid.h:11,
from Comm.h:6,
from Ds2fen.h:9,
from main.h:4,
from Chatwid.cpp:1:
Client.h:23: error: `Comm' has not been declared
Client.h:23: error: ISO C++ forbids declaration of `par' with no type
Client.h:28: error: variable or field `send' declared void
Client.h:28: error: expected `;' before '(' token
Client.h:31: error: variable or field `fullPacket' declared void
Client.h:31: error: expected `;' before '(' token
Client.h:35: error: ISO C++ forbids declaration of `Comm' with no type
Client.h:35: error: expected `;' before '*' token
Client.h:36: error: expected `;' before '(' token
mingw32-make[1]: *** [debug/Chatwid.o] Error 1
mingw32-make[1]: Leaving directory `C:/Users/dark-san/Documents/C_C++/chatvercplusplus'
mingw32-make: *** [debug] Error 2


et j'ai pas oublié de metre la ligne QT += network

P.S: Chose bizard, lorsque je ne met pas la ligne network dans le .pro, il arrete de m'engeuler pour comm, mais il refuse toujour les slots...
0
Et dans le fichier "client.h", est-il bien précisé "#include <comm.h>" ?
0
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
30 janv. 2009 à 17:09
oui, cf premier post...

je vous remerci à tous de m'aider =) meme si pour le moment, on trouve pas... =/
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
30 janv. 2009 à 17:15
Non, ce n'est pas bizarre qu'il n'accepte pas Comm si tu n'as pas mis network dans le .pro. C'est pour ça qu'il faut le mettre.
Tu as bien refait : qmake -project, qmake, make en n'oubliant pas bien sûr de mettre le network dans le .pro ?
0
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
30 janv. 2009 à 18:58
J'ai MIS network, ce qui est bizarre, c'est que lorsque je l'enleve il accepte Comm...
0
Salut !
Moi aussi je ne poste jamais dans un forum, et je préfère me débrouiller tout seul, mais là tu vas continuer à chercher pendant encore longtemps si je ne t'explique pas ma solution.

Lorsqu'on fait ce genre de truc :

class Balle; /* Solution à tous tes problèmes !!! */
class Boule {
// Ce que tu veux

public:
Balle maBalle;

// Ce que tu veux
};

class Balle {
// Ce que tu veux

public:
Boule maBoule;

// Ce que tu veux
};

On voit clairement que la classe Boule a besoin de Balle et réciproquement. La solution est de créer un "prototype de classe" de Balle au-dessus de Boule.

Regarde ce que j'ai ajouté en gras au-dessus de Boule.
C'est un problème rarement rencontré en C et C++ (j'utilise gcc, g++, mingw pour compiler) car les compilateurs récents résolvent le problème automatiquement, mais en Qt (j'utilise la version 4.5.1), il n'est pas rare d'avoir à ajouter cette ligne.

Résumons : s'il te manque un attribut d'une classe, ou tout simplement une classe dans tel ou tel fichier, tu ajoutes au-dessus de celui-ci le prototype de la classe :

class MaClasseManqunte;
0
dark-san > Hwoary
23 mai 2009 à 20:27
MErci, mais sa fait déjà plusieurs mois que j'ais trouvé la solution...

P.S: Il y a une erreur dans ton code, si tu compile sa tu aura une erreur, puisque il ne connais pas encore la
taille d'un objet de type balle, il ne peu donc pas alloué l'espace nécéssaire, il faut un pointeur vers un objet de type balle et faire un new dans le constructeur pour que sa marche...
0
Tu confonds une allocation et un prototype : class Balle permet de savoir que cette classe existe et qu'elle est définit plus loin dans le code, ça ne permet pas de créer une instance de Balle...

Par contre si tu as trouvé une solution à ton problème, merci de la communiquer (c'est comme ça qu'on fait sur les forums...)
0
Dark-Sannhius Messages postés 8 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 30 juin 2011 2
30 juin 2011 à 13:02
Non je confonds rien du tout, si on fait comme cela, il y a un problème dans la définition de la classe Boule de l'exemple car la taille théorique de la classe balle est encore inconnue, elle ne sera connu que lors de la définition de Balle, mais alors ce sera le même problème car la taille de balle est incalculable comme on ne sait pas la taille de boule, c'est le serpent qui ce mange la queux, le seul moyen de briser la chaine est avec un pointeur, car la taille d'un pointeur est fixe, quel que soit la taille de l'objet sur lequel il pointe. Là sinon on a une erreur de compi...

Ce qui est intelligent soit dit en passant car si il n'y avait pas ce problème de compi, ce serai à l'execution que tout planterait, tout simplement parceque ici chaque objet crée un autre objet et sa jusqu'à saturation de la mémoire, en effet lorsque on fait comme sa, on a pas deux objets liées entre eux, un couple balle-boule mais on a sa:

Admettons que l'on crée une boule en premier:

boule crée balle
balle crée boule2
boule2 crée balle2
balle2 crée boule3
boule3 crée balle3
balle3 crée boule4
boule4 crée balle5

etc jusqu'à un nombre tels de boules et balles que tout plante, avec un ptit moment de "ne répond pas" avant.

Donc c'est pas la première definition de Balle que j'incrimine, mais ce qu'il y a dans les classes, la bonne solution est donc, comme je l'ais expliqué il y a de ça plus de DEUX ans (jolie remontage de topic!!! ;)) Et cette fois je vais l'expliciter:

class Balle; sa sa change pas je suis toujours d'accord avec sa! 
class Boule {
// Ce que tu veux

public:
Balle* maBalle; sinon sa plante!!

// Ce que tu veux
};

class Balle {
// Ce que tu veux

public:
Boule maBoule;

// Ce que tu veux
}; 


Et ensuite tu te fait un jolie constructeur pour Boule qui prends en arg un pointeur vers une Balle comme sa tu fait ton truc sans tout faire foirer!! ;p
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
31 janv. 2009 à 17:03
je trouve étrange ta file d'inclusion.
D'après elle tu par du .cpp, tu as des include, tu passe par Comm.h, puis tu va à Client.h, OK ?
Du coup avec les chiens de garde (#ifndef PPP\n #define PPP) tu entre dans client.h sans avoir déclarer la classe Comm.
0