Oui, c'est vrai, mais comme pas mal de sources disponibles font comme cela, je voulais juste pr�ciser que c'�tait quelquefois utile :wink:Citation:
Envoy� par r0d
Version imprimable
Oui, c'est vrai, mais comme pas mal de sources disponibles font comme cela, je voulais juste pr�ciser que c'�tait quelquefois utile :wink:Citation:
Envoy� par r0d
Le but �tant la gestion de livres dans une biblioth�que. L'utilisateur doit cr�er au moins une �tag�re puis au moins un genre. C'est alors qu'il peut cr�er des livres qu'il affecte dans des genres qui se trouvent eux m�mes dans des �tag�re.
Une �tag�re peut contenir plusieurs genres.
Un genre peut contenir plusieurs livres.
Un genre ne peut se trouver que dans une seule �tag�re.
Un livre n'a qu'un seul genre.
Une fois la structure principale (post�e ci dessus) fonctionnelle, je rajouterai des m�thodes. Mais je ne peux pas contuinuer ce programme tant que cela ne marche pas. Voil� vous �tes au courant du but de ce programme. Pouvez-vous m'aider � faire marcher la structure svp?
erf, c'est vrai que c'est pas �vident.
Pour ma part, je ferais simple:
Et ensuite, c'est dans tes fonctions que l'on v�rifie que les conditions sont respect�es. Mais j'avoue que je ne suis pas s�r de moi sur ce coup l�.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class CEtagere { CGenre *m_pGenrePresentsDansEtagere; CLivre *m_pLivresPresentsDansEtagere; } class CLivre { CGenre m_Genre; } class CGenre { ... }
[Balises CODE rajout�es par Loulou24, merci d'y penser � l'avenir]
Salut,
Qu'est-ce que �a donnerait un code comme �a ?
Evidemment il faudra mettre le corps des constructeurs / m�thodes dans les .CPP mais �a aurait pas �t� lisible sinon ....
Etagere.h
Genre.hCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <vector> class Genre; class Livre; class Etagere { Etagere(); vector<Genre*> m_apGenres; vector<Livre*> m_apLivres; void ajouterGenre(Genre& _g) { m_apGenre.push_back( &_g ); } };
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <vector> #include <string> class Etagere; class Genre { Genre(Etagere& _e, string _str) m_Etagere(_e), m_strNom(_str) { m_Etagere.ajouterGenre( *this ); } Etagere& m_Etagere; string m_strNom; vector<Livre*> m_apLivres; void ajouterLivre( Livre& _l) { m_apLivres.push_back( &_l ); } };
Livre.h
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <string> class Genre; class Livre { Livre(Genre& _g, string _str) m_Genre(_g), m_strNom(_str) { m_Genre.ajouterLivre( *this ); } Genre& m_Genre; string m_strNom; };
A utiliser comme suit:
Ca t'irai ?Code:
1
2
3
4
5
6
7
8
9 Etagere et1, et2; Genre policier(et1,"policier"); Genre poesie(et1,"poesie"); Genre sf(et2, "sf"); Livre livre1(sf, "tibidou"); Livre livre2(policier,"tada");
Ca assure un genre par livre (donn� � la construction), et une �tag�re par genre (donn�e aussi � la construction), et voil� :)
Bon vu que mon programme doit �tre pr�sent� au bts et que vos solutions sont assez compliqu�es... j'ai modifi� mon code :
// Classe Genre //Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 // Classe Etagere // class etagere { private : int numetagere; public : int tabgenre[100]; etagere (int numero_etagere) {numetagere = numero_etagere;} int retourne_etagere(void) {return numetagere;} };
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class genre { private: char* libgenre; public: char* tablivre[100]; int tabetagere[100]; genre (char* libelle_genre) {libgenre = libelle_genre;} char* retourne_genre(void) {return libgenre;} };
programme principal :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // Classe Livre // class livre { private : char* titlivre; public : int son_etagere; char* son_genre; livre (char* titre_livre) {titlivre = titre_livre;} char* retourne_livre(void) {return titlivre;} };
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 #include "Etagere.h" #include "Genre.h" #include "Livre.h" void main() { int numetagere_s = 0; char* libgenre_s = ""; char* titlivre = ""; int action = 0; 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_s; etagere (numetagere_s); cout<< "Vous avez cree l'etagere numero :"; cout<<"\n"; numetagere_s = etagere.retourne_etagerere(); cout<< "\n"; numetagere_s = 0; break; case 2: cout<< "Veuillez entrez le libelle du nouveau genre SVP."; cout<< "\n\n"; cin >> libgenre_s; genre (libgenre_s); cout<< "Vous avez cree le genre :"; cout<< "\n"; libgenre_s = genre.retourne_genre(); cout<< "\n"; libgenre_s = ""; break; case 3: cout<< "Veuillez entrer le titre du nouveau livre"; cout<< "\n\n"; cin >> titlivre; livre (titlivre); cout<< "Vous avez cree le livre :"; cout<< "\n"; titlivre = livre.retourne_livre(); cout<< "\n"; titlivre = ""; break; } }
Avec �a j'ai les erreurs suivantes :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Compiling... Prog_util.cpp C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(34) : error C2512: 'etagere' : no appropriate default constructor available C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(37) : error C2039: 'retourne_etagerere' : is not a member of 'etagere' c:\documents and settings\christophe\bureau\cours\ap2 - gestion des livres\gestion_biblio\bibliothèque\etagere.h(10) : see declaration of 'etagere' C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(42) : error C2360: initialization of 'numetagere_s' is skipped by 'case' label C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(34) : see declaration of 'numetagere_s' C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(47) : error C2512: 'genre' : no appropriate default constructor available C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(50) : error C2275: 'genre' : illegal use of this type as an expression c:\documents and settings\christophe\bureau\cours\ap2 - gestion des livres\gestion_biblio\bibliothèque\genre.h(9) : see declaration of 'genre' C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(55) : error C2360: initialization of 'libgenre_s' is skipped by 'case' label C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(47) : see declaration of 'libgenre_s' C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(55) : error C2360: initialization of 'numetagere_s' is skipped by 'case' label C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(34) : see declaration of 'numetagere_s' C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(60) : error C2512: 'livre' : no appropriate default constructor available C:\Documents and Settings\Christophe\Bureau\Cours\AP2 - Gestion des livres\Gestion_biblio\Bibliothèque\Prog_util.cpp(63) : error C2275: 'livre' : illegal use of this type as an expression c:\documents and settings\christophe\bureau\cours\ap2 - gestion des livres\gestion_biblio\bibliothèque\livre.h(9) : see declaration of 'livre'
Pouvez-vous juste m'aider � enlever ces erreurs? merci beaucoup par avance
1ere erreur: error C2512: 'etagere' : no appropriate default constructor available : Il te faut un constructeur pour ta classe etagere:
2eme erreur: error C2039: 'retourne_etagerere' : is not a member of 'etagere' ce ne serait pas plutot retourne_etagere ? ;)Code:
1
2
3
4
5
6
7
8 class etagere { public: etagere(); private: ... };
3eme erreur:error C2360: initialization of 'numetagere_s' is skipped by 'case' label tu n'a pas le droit de d�larer des variables dans un case!
4eme erreur:error C2512: 'genre' : no appropriate default constructor available il te faut un constructeur pour la classe genre:
etc...Code:
1
2
3
4
5
6
7
8 class genre { public: genre(); private: ... };
Je me permet de te donners quelques conseils, car je suis pass� par l� moi aussi:
- Lis tes messages d'erreurs et comprends-les, tu trouveras toi-m�me tes erreurs->c'est plus rapide (que d'attendre une r�ponse sur un forum) et �a fais progresser plus vite.
- Fais attention au nommage de tes classes/fonctions/variables, �a t'�viteras beaucoup d'erreurs et �a te fera gagner du temps. Je t'explique rapidement les conventions pour le c++:
- une classe commence par un C majuscule et la premiere lettre est en majuscule. Ex class genre -> class CGenre.
- une variable commence par un lettre indiquant son type (int->i, string->str), avec des Majuscules pour d�limiter les mots, etc. Ex: int numetagere-> int iNumEtagere.
- une variable membre (c'est � dire qu'elle est d�clar�e dans une classe) commence par m_. Ex: int iNumEtage -> int m_iNumEtagere. string libgenre->string m_strLibGenre;
- n'utilise pas de char*, mais des string!!!!
- jamais de code dans les .h:
le .h:
et le .cpp:Citation:
// Classe Etagere //
class CEtagere
{
CEtagere(); //le constructeur que tu as oubli�
private :
int numetagere;
public :
int m_aiTabGenre[100]; //m_ car c'est une variable membre, a pour array(tableau), i pour int
void etagere (int numero_etagere); //si ta fonction ne retourne rien, il faut le void au d�but
int retourne_etagere(void) ;
};
d�j�, si tu fais �a, �a compilera bient�t ;)Code:
1
2
3
4
5
6 CEtagere::CEtagere(){} //le constructeur que tu as oublié, même s'il est vide, il faut le mettre void CEtagere::etagere(int numero_etagere) { numetagere = numero_etagere; } //tu avais mis cette fonction dans le .h, il faut la mettre dans le .cpp
Un dernier truc, juste pour la lisibit� (mais c'est pas trop important): habituellement, on utilise des fonction Get et SEt pour acc�der/modifer les variables membres. Get() c'est pour r�cup�rer la variable, Set() c'est pour la modifier: ex:
et le .cpp:Code:
1
2
3
4
5
6
7
8
9
10
11 class CUneClasse { public: CUneClasse(); //le constructeur int getMaVariable(); void setMaVariable(int iMaValeur); private: int m_iMaValeur; };
hope it helpsCitation:
CUneClasse::CUneClasse(){} //le constructeur, vide
int CUneClasse::getMaVariable()
{
return m_iMaVariable;
}
void CUneClasse::setMaVariable(int iMaVariable)
{
m_iMaVariable = iMaVariable;
}
Pourquoi mes string ne fonctionnent pas alors que j'ai d�fini #include<string.h> ???
Citation:
Envoy� par Contrec
Code:#include <string>
J'ai r�ussi � faire fonctionner tout �a, maintenant j'ai qualques probl�mes au niveau des cha�nes de caract�re (dsl pour mes char*) ainsi que pour d�clarer dans mon .cpp des tableaux d'objets (1 pour etagere, 1 pour livre, 1 pour genre). Peut-on m'aider svp?
et bien, quels sont tes probl�mes? (pr�cise)
Lu'
De m�me que le passage char* -> string, je te conseille de faire le grand saut montype[] -> vector<monType>
Regarde dans la page 3, je t'avais mis un exemple d'utilisation. En gros (pour simplifier), c'est un tableau qui se redimentionne automatiquement. Tu le d�clares comme suit:
(tu noteras le m�me genre de notation que r0d : m_ai = tableau d'entier membre de ta classe)Code:
1
2
3 #include <vector> std::vector<int> m_aiMonTableauDEntiers;
et tu l'utilise comme �a:
Voil� voil�, c'est g�n�ralement plus sur et plus lisible d'utiliser les types de la libriaire standard C++ (string, vector, list, ...) plut�t que les �quivalents C.Code:
1
2
3
4
5
6 m_aiMonTableauDEntiers.push_back(8); m_aiMonTableauDEntiers.push_back(1); m_aiMonTableauDEntiers.push_back(12); cout << m_aiMonTableauDEntiers[0] << endl; // affichera 8 cout << m_aiMonTableauDEntiers.size() << endl; // affichera 3
Regarde ce site la, c'est pas mal fait en cas de trou de m�moire :)
http://www.sgi.com/tech/stl/
~bigquick~
Mais le peit probl�me c'est que mon programme est tout simple et destin� � �tre pr�sent� pour mon BTS donc je ne veut pas faire plus compliqu�. Je n'ai que trois classes donc �a ira avec ces noms de variables. Maintenant ce que je voudrai faire, c'est que quand je cr�e un objet etagere par exemple, je voudrai le placer dans un tableau d'objets de type etagere pour pouvoir avoir :
sans m�me avoir � donner un nom sp�cifique � chaque objets de ma classe comme :Code:etagere(num_etagere)[i].retourne_nom();
Lorsque je d�clare un tableau etagere tab_etagere[100]; le compilateur dit que mon constructeur n'est pas bon. Il doit manquer mon param�tre num_etagere, du coup jhe ne sait pas comment faire.Code:
1
2 etagere etagere_a(num_etagere); etagere etagere_b(num_etagere) etc...;
je voudrai etagere(num_etagere)[i] avec i indice du tableau de type etagere.
La meme chose pour genre et livre.
On m'a dit que cr�er une classe 'collection' ayant ces trois tableaux et des m�thodes pour retourner les indices, et variables membres seraient pas mal.
Si je comprends ce qui se passe, tu d�clares (en gros):
mais ton constructeutr d'�tag�re a besoin d'un indice ... donc le compilateur ne sait pas quel indice donner � tes �l�ments du tableau....Code:Etagere tab[100];
La solution, c'est l'allocation dynamique :)
Tu d�clares un tableau de pointeurs sur Etageres, et tu cr��s toutes les �tageres:Et voil�, �a va te cr��r 100 �tag�res, avec des indices de 0 � 99.Code:
1
2
3 Etagere* tab[100]; for (int i=0; i<100; ++i) tab[i] = new Etagere(i);
Apr�s tu peux te servir de ton tableau avec l'operateur -> plut�t que . (puique ce sont des pointeurs et non tes objets directement), donc:Enfin, � la fin de ton programme, n'oublie pas de supprimer tes �tageres (comme tu les a cr��es � la main, il faut les supprimer � la main):Code:tab[23]->retourne_nom();
Code:
1
2 for (int i=0; i<100; ++i) delete tab[i];
J'ai fait comme tu m'a dis, il n'y a aucune erreur � la compilation, seulement lorsque j'ex�cute pour tester, j'ai une erreur syst�me lorsuqe j'entre le num�ro de l'�tag�re... Exactement comme lorsque je veux entrer un libell� de genre ou un titre de livre.. je ne vois vraiment pas pourquoi ces erreurs apparaissent...
Voil� je peux cr�er des �tageres mais lorsqu'il s'agit de retourner une chaine de caract�re, une erreur windows apparait.
Je met :
ne faudrait-il pas que j'utilise strcpy pour renvoyer ma cha�ne de caract�re? car je ne sais pas m'en servir.Code:char* retourne_genre(void) {return libgenre;}
Merci d'avance