Rechercher : dans
Par :

C++:Probleme Compilation, class non definie

Dernière réponse le 23 mai 2009 à 20:27:55 Dark-Sannhius, le 29 jan 2009 à 16:56:58 
 Signaler ce message aux modérateurs

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!

Configuration: Windows Vista
Internet Explorer 7.0

Meilleures réponses pour « C++:Probleme Compilation, class non definie » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
WSH - Objet WshShell VoirWshShell L'objet WshShell contient des informations sur l'environnement d'exécution, ainsi que des méthodes permettant de gérer l'exécution locale d'applications, de manipuler la base de registre, d'accéder aux ressources systèmes (base de...

1

kill4m, le 29 jan 2009 à 16:58:59

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. Mieux vaut se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet . 
mais pourquoi je fais jamais ce que je dis moi ....

Répondre à kill4m

2

Dark-Sannhius, le 29 jan 2009 à 17:54:31

Non, sa change rien =S vraiment bizard...

Répondre à Dark-Sannhius

3

loupius, le 29 jan 2009 à 18:27:38

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.

Répondre à loupius

4

Dark-Sannhius, le 29 jan 2009 à 20:49:53

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 =)

Répondre à Dark-Sannhius

5

loupius, le 29 jan 2009 à 23:04:46

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.

Répondre à loupius

6

Dark-Sannhius, le 29 jan 2009 à 23:16:00

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...

Répondre à Dark-Sannhius

7

loupius, le 29 jan 2009 à 23:41:43

"void send(Packet pac); "
Mais je ne vois pas cette ligne dans le fichier que tu as posté!

Répondre à loupius

8

fiddy, le 30 jan 2009 à 00:43:52

Salut,
As-tu bien pensé à configurer ton fichier .pro ? Il faut mettre :

QT += network

N'oublie pas de régénérer le Makefile ;)
Google is your friend

Répondre à fiddy

9

Char Snipeur, le 30 jan 2009 à 08:54:14

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

10

Dark-Sannhius, le 30 jan 2009 à 16:55: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...

Répondre à Dark-Sannhius

11

loupius, le 30 jan 2009 à 17:06:29

Et dans le fichier "client.h", est-il bien précisé "#include <comm.h>" ?

Répondre à loupius

12

Dark-Sannhius, le 30 jan 2009 à 17:09:58

Oui, cf premier post...

je vous remerci à tous de m'aider =) meme si pour le moment, on trouve pas... =/

Répondre à Dark-Sannhius

13

fiddy, le 30 jan 2009 à 17:15:06

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 ?
Google is your friend

Répondre à fiddy

14

Dark-Sannhius, le 30 jan 2009 à 18:58:07

J'ai MIS network, ce qui est bizarre, c'est que lorsque je l'enleve il accepte Comm...

Répondre à Dark-Sannhius

16

Hwoary, le 23 mai 2009 à 20:22:18

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;

Répondre à Hwoary

17

 dark-san, le 23 mai 2009 à 20:27:55

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...

Répondre à dark-san

15

Char Snipeur, le 31 jan 2009 à 17:03:17

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. Salutation !
Char Snipeur

Répondre à Char Snipeur