mais pourquoi mettre un .cpp pour chaque classe? je n'y comprend plus rien
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 ?
exactEnvoy� par Contrec
exactEnvoy� par Contrec
exactEnvoy� par Contrec
La d�claration de ta classe, c'est le .h.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.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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7 #include "etagere.h" void etagere::init(int numEtagere) { numero = numEtagere; }
Classe genre (fichier genre.cpp) :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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.
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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 ....
Envoy� par Contrec
il faut repenser tout le programme.
(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.
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 .cpp
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 .h
Code : S�lectionner tout - Visualiser dans une fen�tre � part 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.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
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?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...Envoy� par r0d
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
![]()
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 �galementEnvoy� par r0d
si on connaissait les besoins, on pourrait te guider pour la conception des classes.
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?Envoy� par rolkA
Partager