prob de declaration - C++ - Programmation
Marsh Posté le 30-04-2005 à 01:03:51
Salut,
Code :
|
Pourquoi redéclarer une classe incluse ?
Soit tu utilises les forward déclarations, qui ne peuvent être utilisées qu'avec des pointeurs et donc tu modifies
Code :
|
en
Code :
|
et tout le code de ton .cpp. Soit tu vires ladite déclaration.
Marsh Posté le 30-04-2005 à 09:24:11
ben disons que la pre declaratin des classes mon prof m'en avait parlé en cas de probleme mais la ca marche pas et a paet un pointeur y a pas d'autre solution
Marsh Posté le 30-04-2005 à 09:27:36
ben en mettant un pointeur en faite j'ai pluis de prob a la compilation mais a l'execution c'est un carnage access violation
Marsh Posté le 30-04-2005 à 14:45:40
L'intérêt des forward declarations, c'est de gagner du temps à la compilation.
Je m'explique : ton compilateur compilera tout les .cpp modifiés. Si tu modifies un header, tout les .cpp qui l'incluent seront donc recompilés. Ce qui revient à dire que si tu modifies GestionSelfDlg.h qui est inclus par IHM_PcControl.h, le code de GestionSelfDlg.cpp (s'il s'appelle comme ça) sera recompilé (normal). Mais, IHM_PcControl.h aura aussi été modifié et donc IHM_PcControl.cpp (s'il s'appelle comme ça encore une fois) sera aussi recompilé, ce qui est normal aussi puisqu'il utilise CGestionSelfDlg.
Là où ça devient génant, c'est lorsque IHM_PcControl.h est inclus dans d'autre fichiers (h ou cpp). La recompilation de ces fichiers deviendra obligatoire alors qu'il n'utilise peut-être pas ton instance de CGestionSelfDlg. D'où un suplément de temps de compilation inutile.
Alors que si tu utilises la forward declaration, tu dois déclarer un pointeur (et donc bien sûr l'allouer et le libérer quand il faut). Cette manip fait en sorte que tu n'ait pas à recompiler des fichiers qui ne devrait pas l'être.
J'espère que cette explication n'est pas un "plat de spaghetti" et que c'est à peu près clair...
Marsh Posté le 30-04-2005 à 23:09:19
je veux bien mais a part ralentir la comppilation ca exprique aps pourquoi ca marche pas
le message d'erreur exacte est :
Compiling...
GestionSelf.cpp
d:\programmation\c++\msdev98\myprojects\gestionself\ihm_pccontrol.h(23) : error C2079: 'm_SelfDlg' uses undefined class 'CGestionSelfDlg'
GestionSelfDlg.cpp
d:\programmation\c++\msdev98\myprojects\gestionself\ihm_pccontrol.h(23) : error C2079: 'm_SelfDlg' uses undefined class 'CGestionSelfDlg'
IHM_PcControl.cpp
d:\programmation\c++\msdev98\myprojects\gestionself\gestionselfdlg.h(27) : error C2079: 'm_PcControlDlg' uses undefined class 'CIHM_PcControl'
Generating Code...
Error executing cl.exe.
GestionSelf.exe - 3 error(s), 0 warning(s)
Marsh Posté le 01-05-2005 à 11:37:39
a chaque fois que je rajoute un objet de type CGestionSelfDlg dans une autre classe ca me rajoute 3erreur et apres meme en suprimant l'objet impossible de supprimer toutes les erreurs
Marsh Posté le 01-05-2005 à 12:24:41
Citation : [C++] prob de declaration |
Code :
|
et vala, une fort belle déclaration en C++
ne me remercie pas
Marsh Posté le 01-05-2005 à 12:26:48
bon, sinon, ton pb c'est que tu fais une forward declaration de CGestionSelfDlg (soit tno class CGestionSelfDlg; ), ce que tu as le droit de faire, mais ensuite tu instancie un objet de ce type, ce que tu n'as pas le droit de faire car le compilo ne connait pas la taille de l'objet a ce moment la
Apres une forward, tu peux declarer des pointeurs sur ton type (bzw pointeur de pointeur..) et ds references, mais tu ne peux pas allouer un objet de ce type (ce que tu fais la)
Donc au lieu de faire class CGestionSelfDlg;, le mieux c'est de faire un bete #include "lefichierquidefinit CGestionSelfDlg"
Marsh Posté le 01-05-2005 à 12:31:47
je veux bien mais #include "lefichierquidefinit CGestionSelfDlg" je l'ai deja mis c'est le #include "GestionSelfDlg.h" nan
Marsh Posté le 01-05-2005 à 12:35:51
Bon jcrois que tu nous a montré deux fois le meme code non ? et au vu de ets messages d'erreurs, je crois que t'as un fichier A qui inclue B, et B qui inclue aussi A, ce qui ne va pas
Marsh Posté le 01-05-2005 à 12:41:11
ben c'est exactement ca j'ai deux classe A et B.
Dans la classe A j'ai un objet de la classe B et dans la classe B j'ai un objet de la claase A
Code :
|
voila en gros cs que je veux faire mais j'y arrive pas
Marsh Posté le 01-05-2005 à 12:46:24
bin ca tu peux tout betement pas, vu que ca fait des objets d'une taille infinie.
t'as un gros pb de conception
Marsh Posté le 01-05-2005 à 12:50:41
ben en faite je savais pas que c'etait impossible et mer..
bon ben on reprend la phase d'analyse
merci quand meme
Marsh Posté le 01-05-2005 à 13:00:16
dreamkiller a écrit : ben en faite je savais pas que c'etait impossible et mer.. |
et ca c'est possible ?
Code :
|
Marsh Posté le 01-05-2005 à 13:00:50
bin non plus, objet de taille infinie
fo passer des ptrs
Marsh Posté le 01-05-2005 à 13:04:25
chrisbk a écrit : bin non plus, objet de taille infinie |
c'etait de l'ironie , dans le meme genre (pour moi c'est la mem chose)
Marsh Posté le 01-05-2005 à 13:06:52
j'ai comme l'impression qu il y a du foutage de gueulle y en a qui on jamais fait d'erreur et qui savait tous des le debut
Marsh Posté le 30-04-2005 à 00:30:01
voila j'ai un prob de declaration et je sais pas d'ouca vien c'est sur les lignes 20
et 23
merci d'avance