Création
d'entreprise
Posez votre question Signaler

C++:Probleme Compilation, class non definie

Dark-Sannhius 7Messages postés 29 janvier 2009Date d'inscription 30 juin 2011Dernière intervention - Dernière réponse le 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!
Lire la suite 

C++:Probleme Compilation, class non definie »

19 réponses
Réponse
+2
moins plus
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 =)
loupius - 29 janv. 2009 à 23:04
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
non, sa change rien =S vraiment bizard...
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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...
loupius - 29 janv. 2009 à 23:41
"void send(Packet pac); "
Mais je ne vois pas cette ligne dans le fichier que tu as posté!
Ajouter un commentaire
Réponse
+0
moins plus
Salut,
As-tu bien pensé à configurer ton fichier .pro ? Il faut mettre :
QT += network

N'oublie pas de régénérer le Makefile ;)
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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...
loupius - 30 janv. 2009 à 17:06
Et dans le fichier "client.h", est-il bien précisé "#include <comm.h>" ?
Ajouter un commentaire
Réponse
+0
moins plus
oui, cf premier post...

je vous remerci à tous de m'aider =) meme si pour le moment, on trouve pas... =/
Ajouter un commentaire
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
J'ai MIS network, ce qui est bizarre, c'est que lorsque je l'enleve il accepte Comm...
dark-san - 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...
johanvs - 30 juin 2011 à 10:42
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...)
Dark-Sannhius- 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
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Ce document intitulé « C++:Probleme Compilation, class non definie » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?