mais pourquoi mettre un .cpp pour chaque classe? je n'y comprend plus rien
Version imprimable
mais pourquoi mettre un .cpp pour chaque classe? je n'y comprend plus rien
bah, c'est la fa�on la plus simple, la plus classique, plus logique et la plus mieux bien de d�velopper en C++:
pour chaque classe:
un fichier .h dans lequel tu d�clare ta classe
ex: fichier A.h
un fichier .cpp dans lequel tu impl�mente ta classe:Code:
1
2
3
4
5
6
7
8
9
10
11 #ifndef _A_H_ #define _A_H_ class A{ A(); //le constructeur int GetValue(); //une methode int m_iValue; //une variable membre } #endif
ex: fichier A.cpp
ensuite, dans si ton main utilise une classe A, il faudra ajouter #include "A.h" dans ton main.Code:
1
2
3
4
5
6
7
8 #include "A.h" A::A(){} //le constructeur int A::GetValue() { return m_iValue; }
De mani�re g�n�rale, si tu utilise une classe dans un fichier, tu devra inclure le .h correspondant. Si tu utilise la MFC, beaucoup de classes sont d�finies dans stdafx.h, tu n'auras donc pas besoin d'inclure les classes "de base" tels CString par ex.
donc �a me ferai 3.h et 4.cpp avec le main...
Je vais tester tout cela mais je suis un d�butant dans la programmation, tout ce qui est dit dans ce sujet n'a pas march� jusque l�...
Ma classe etagere appelle un objet 'genre', ma classe genre appelle des objets 'etagere' et 'livre' et ma classe livre appelle un objet 'genre'.
Le flou persiste � 2 endroit : - la cr�ation de fichiers .h et .cpp
- L'appel de classes dans d'autres classes
je vais tout recommencer, donc l'�tape � suivre est un fichier .h et .cpp par classe, un fichier .cpp pour le main
des #ifndef et #endif dans chaque fichier .h
et les d�clarations anticip�es de classes.
Est-ce exact ?
exactCitation:
Envoy� par Contrec
exactCitation:
Envoy� par Contrec
exactCitation:
Envoy� par Contrec
La d�claration de ta classe, c'est le .h.Citation:
Envoy� par Contrec
Arghh, je viens de voir un erreur dans le code que je t'ai donn�: il ne faut pas oublier le ; � la fin de la d�claration de ta classe:
class A
{
...
};
Franchement si �a marche... je te dois le respect car j'ai perdu espoir mais je suis oblig� de continuer pour mon BTS
Le fichier .cpp de chaque classe doit contenir les m�thodes de la classe ou juste l'impl�mentation?
tu utilise quel environnement? visual6?
Oui le studio 6, mon programme va etre assez petit donc je ne voudrai pas tout compliquer pourquoi?
l'impl�mentation. Regarde bien l'exemple que je t'ai donn� pr�c�demment.Citation:
Envoy� par Contrec
dans le .h, tu d�clare
dans le .cpp, tu impl�temente
�a ne marche pas du tout...
Je peux laisser l'ensemble de mon code pour expertise (il n'y en a pas beaucoup) STP ?
ok, vas-y. Juste un truc: s�pare bien chaque fichier et indique le nom de chacun.
alors c'est parti :
Classe etagere (fichier etagere.h) :
Classe etagere (fichier etagere.cpp) :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 // Classe Etagere // #ifndef _ETAGERE_H_ #define _ETAGERE_H class etagere { private: int numero; int nbgenre; genre tabgenre[100]; public : void init(int numEtagere); int retourne_Etagere(); }; int etagere::retourne_Etagere() { return numero; } #endif
Classe genre (fichier genre.h) :Code:
1
2
3
4
5
6
7 #include "etagere.h" void etagere::init(int numEtagere) { numero = numEtagere; }
Classe genre (fichier genre.cpp) :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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 // Classe Genre // #ifndef _GENRE_H_ #define _GENRE_H_ class genre { private: char* libelle; int nblivre; livre tablivre[100]; etagere ob_etagere; public: void init( char* libelleGenre, etagere uneEtagere); char* retourne_genre(); int rangLivre (char* titreLivre); int titre_comp; void placeLivre (livre unLivre); }; char* genre::retourne_genre() { return libelle; } int genre::rangLivre(char* titreLivre) { int i; for (i = 0, i <= 100, i++) { titre_comp = tablivre[i].getTitre while ((i <= nblivre) && (titre_comp < titreLivre)) { i++; } return i; } } void placeLivre(livre unLivre) { int pos = 0; int i = pos; int rangLivre (unLivre.titre); for (i = pos; i<= nblivre; i++) { tablivre[i] = tablivre[i+1]; } tablivre[pos] = unLivre; } #endif
Classe livre (fichier livre.h) :Code:
1
2
3
4
5
6
7
8 #include "genre.h" void genre::init(char* libelleGenre, etagere uneEtagere) { tablivre = 0; strcpy(libelle, libelleGenre); ob_etagere = uneEtagere; }
classe livre (fichier livre.cpp) :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 // Classe Livre // #ifndef _LIVRE_H_ #define _LIVRE_H_ class livre { private : char* titre; genre leGenre; public : void init(char* titreLivre, genre unGenre); char* getTitre (); }; char* livre::getTitre() { return titre; } #endif
Programme principal (fichier Main.cpp) :Code:
1
2
3
4
5
6
7 #include "livre.h" void livre::init(char* titreLivre) { strcpy (titre, titreLivre); leGenre = unGenre; }
Voil� c'est tout, tu risque de voir des ab�rations dans mon code, j'en suis d�sol�, il doit y avoir au moins 50 fautes...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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 #include<iostream.h> // cin et cout // #include<string.h> // strcpy pour chaîne de caractères // #include<stdio.h> // gets pour chaîne de caractères // #include "etagere.h" #include "genre.h" #include "livre.h" void main() { int numEtagere; char* libelleGenre; char* titreLivre; int action; char* libelle_s; char* titre_s; int num_etagere_s; etagere uneEtagere; livre unLivre; cout<< "Que voulez-vous faire ?" cout<<"\n\n"; cout<<"\t"; cout<<"1 : Creer une nouvelle etagere."; cout<<"\n"; cout<<"\t"; cout<<"2 : Creer un nouveau genre."; cout<<"\n"; cout<<"\t"; cout<<"3 : Creer un nouveau livre."; cout<<"\n\n"; cin >> action switch (action) { case 1: cout<< "Veuillez entrez le numero de l'etagere à creer SVP."; cout<< "\n\n"; cin >> numEtagere; etagere.init (numEtagere); cout<< "Vous avez cree l'etagere numero :"; cout<<"\n"; num_etagere_s = etagere.retourne_Etagere(); cout<< "\n"; numEtagere = 0; break; case 2: cout<< "Veuillez entrez le libelle du nouveau genre ainsi que le numero de l'etagere SVP."; cout<< "\n\n"; cin >> libelleGenre; cin >> numEtagere; uneEtagere.init(numEtagere); genre.init (libelleGenre, uneEtagere); cout<< "Vous avez cree le genre :"; cout<< "\n"; libelle_s = genre.retourne_genre(); cout<< "\n"; numEtagere = 0; libelleGenre = ""; break; case 3: cout<< "Veuillez entrer le titre du nouveau livre ainsi que son genre SVP."; cout<< "\n\n"; cin >> titreLivre; cin >> libelleGenre; livre.init(titreLivre, libelleGenre); cout<< "Vous avez cree le livre :"; cout<< "\n"; titre_s = livre.getTitre(); cout<< "\n"; titreLivre = ""; libelleGenre = ""; break; } }
Merci de ta patience
je te r�ponds plus tard, dans la soir�e.
ok
C'est vraiq ue c'est probl�matique:
1. livre a besoin de connaitre la taille de genre pour la d�claration "genre leGenre;", donc sa d�finition compl�te
2. Pour d�finir genre, il faut connaitre la taille de livre pour la d�claration "livre tablivre[100];", donc sa d�finition compl�te
=> cercle vicieux.
Moi, je construirais mes objets sur le tas.
C'est-�-dire que ceci ...
... serait remplac� par cela:Code:
1
2
3
4
5
6 genre leGenre; ... livre tablivre[100]; ... genre tabgenre[100];
Pourquoi ? Car l� on n'a pas besoin de conna�tre la taille, il suffit juste de d�clarer les classes, sans les d�finir totalement:Code:
1
2
3
4
5
6 genre* leGenre; ... livre* tablivre[100]; ... genre* tabgenre[100];
Exemple avec etagere.h :
Bien sur cela complique la gestion de la m�moire, mais de toutes fa�ons, les objets sont faits pour �tre allou�s sur le tas et non pas sur la pile (sauf pour les tous petits objets).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 // Classe Etagere // #ifndef _ETAGERE_H_ #define _ETAGERE_H class genre; // <- nouveau class etagere { private: int numero; int nbgenre; genre* tabgenre[100]; // changement ....
:roll: il faut repenser tout le programme.Citation:
Envoy� par Contrec
(comme dit rolkA --> include multiple = cercle vicieux)
et il faut revoir �galement
- les include
- les ;
- les conventions de nommage
- les boucles
- char* / std::string
- std::vector
- les constructeurs, les accesseurs, les modifieurs
...
j'ai bien essay� de "rafistoler" le code, mais comme je ne sais pas exactement ce que tu veux faire c'est bof.
http://membres.lycos.fr/bigboomshaka...ar-gif-311.gif Enjoy yourself !
Excuse-moi, j'avais du taf urgent � finir...
ok, c'est un bon d�but.
1/ je dois savoir comment tu as cr�� ton projet. Est-ce que tu utilise la MFC?
2/ IL NE DOIT PAS Y AVOIR DE CODE DANS TES .H!!!!
�a c'est du code:
il faut donc le mettre dans le .cppCode:
1
2
3
4 int etagere::retourne_Etagere() { return numero; }
�a c'est la d�claration:
il ne doit y avoir QUE les d�clarations dans ton .hCode:int retourne_Etagere();
3/ Il y a quelques erreurs (il s'agit peut-�tre de fautes de copier/coller ou de fautes de frappes):
#ifndef _ETAGERE_H_
#define _ETAGERE_H_ (tu as oubli� le dernier _ )
4/ n'utilise pas de char*.Le char* est la premi�re source d'erreur et de prises de t�tes interminables.Citation:
Envoy� par divers membres de dvp
Si tu utilise la MFC, utilise des CString, sinon, des string(std). C'est pour �a qu'il est important de savoir quelle lib tu utilise (MFC ou std). Ce sera ton premier exercice: savoir quelle lib tu utilise :D
Je suis d'accord. Mais � mon sens, le plus simple est de revoir un peu la conception de ce programme. Est-tu oblig� d'utiliser cette structure?Citation:
Envoy� par rolkA (je me suis pas tromp� ;)
5/ il ya des erreurs d'algo dans tes fonctions, mais on va d�j� essayer de compiler, le reste, on verra apr�s.
Mwais... :roll: Si on veut des accesseurs ayant un co�t nul, on les met inline... Mettre le code des accesseurs dans une en-t�te n'est pas un trag�die :PCitation:
Envoy� par r0d
Le reste me para�t aussi important: MFC (CString) ou librairie standard du C++ (std::string) ? En tout cas pas C (char*)...
oui il me semble que j'ai vu �a quelquepart �galement :lol:Citation:
Envoy� par r0d
si on connaissait les besoins, on pourrait te guider pour la conception des classes.
http://membres.lycos.fr/bigboomshaka...ar-gif-311.gif Enjoy yourself !
Je suis d'accord, mais pour l'instant, le mieux pour lui est de faire simple, donc d'appliquer des r�gles simples. Visiblement, il d�bute en C++, il ne faut donc pas cpmmencer � lui parler des subtilit�s de ce langage. Non?Citation:
Envoy� par rolkA