Oui, c'est vrai, mais comme pas mal de sources disponibles font comme cela, je voulais juste préciser que c'était quelquefois utileEnvoyé par r0d
Oui, c'est vrai, mais comme pas mal de sources disponibles font comme cela, je voulais juste préciser que c'était quelquefois utileEnvoyé 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.h
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 #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 : 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 #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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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 // 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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 // 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 : 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 #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 : 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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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:// 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 helpsCUneClasse::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> ???
Envoyé par Contrec
Code : Sélectionner tout - Visualiser dans une fenêtre à part #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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part tab[23]->retourne_nom();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part char* retourne_genre(void) {return libgenre;}
Merci d'avance
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager