les classes, les structures, et les .h ???

les classes, les structures, et les .h ??? - C++ - Programmation

Marsh Posté le 04-04-2005 à 19:06:38    

 
Bonjour,  
 
je débute en C++ ... alors d'avance pardon... :sarcastic:  
 
J'ai une classe Musique placée dans le fichier musique.cpp, dans lequel il y a le corps des méthodes
ex :  
void Musique::lecture() {
     fm->lecture();
}  
 
J'ai un fichier musique.h dans lequel j'ai mis :
class Musique
{
private:
 int module;
 FMUSIC_MODULE *fm;
 FSOUND_SAMPLE *fs;  
 void extension();
public:
 Musique();
        /* etc... */
};
 
Le problème c'est que ma classe utilise un structure placé dans le fichier fmod.h
Quand j'inclus le point fmod.h dans l'un ou dans l'autre de ces deux fichiers, le compilateur dit :
" [... ] musique.cpp: In member function `void Musique::lecture()':
musique.cpp:107: error: invalid use of undefined type `struct FMUSIC_MODULE'
fmod.h:48: error: forward declaration of `struct FMUSIC_MODULE' [...]"
 
Ou dois-je inclure fmod.h pour qu'il le reconnaise ???  :bounce:  
 
Merci d'avance pour vos réponses  :)

Reply

Marsh Posté le 04-04-2005 à 19:06:38   

Reply

Marsh Posté le 04-04-2005 à 19:58:14    

avant la declaration de ta classe.

Reply

Marsh Posté le 04-04-2005 à 20:28:25    

J'ai déjà essayé, mais ça ne change rien...
J'ai toujours le meme message d'erreur.

Reply

Marsh Posté le 04-04-2005 à 23:14:02    

heu je sais pas si çà peu t'aider mais pour éviter d'inclure plusieur fois les fichier .h il faut que tu mette en début de tes fichiers . h la directivre #pragma once ou alors :
 
#ifndef _MONFICHIER_H_MESINITIAL_
#define _MONFICHIER_H_MESINITIAL_
 
// ton fichier
 
#endif
 
Sinon je comprend pas très bien l'enchainement de tes .h :s désolé

Reply

Marsh Posté le 05-04-2005 à 19:45:46    

J'ai essayé ta solution mais ça en fonctionne toujours pas  :??:  
 
En fait, histoire de résumé ce que je veux faire : :D  
 
c'est utiliser une structure qui est defini dans un fichier a.h,  
dans une classe défini dans un fichier b.h. Les fonctions de ma classe sont définies dans un fichier c.cpp
 
Alors comment faire pour que le classe connaise la structure défini dans le fichier a.h ???  :sarcastic:


Message édité par Binoi le 05-04-2005 à 19:47:32
Reply

Marsh Posté le 05-04-2005 à 19:51:16    

tu mets #include "a.h" en haut de b.h ...

Reply

Marsh Posté le 05-04-2005 à 19:54:55    

deja dis monsieur :o
mais c'est pas ça dixit binoi :o

Reply

Marsh Posté le 05-04-2005 à 20:06:18    

Monsieur, ;)
Tu peux nous mettre les premieres lignes de musique.h et musique.cpp stp ?

Reply

Marsh Posté le 05-04-2005 à 20:10:02    

Joel F a écrit :

deja dis monsieur :o
mais c'est pas ça dixit binoi :o


 
J'ai déjà fait ça !  
Mais ça marche pas  ;)  
 
J'ai toujours des erreus dans mon fichiers c.cpp  
(j'ai mis #include "b.h" dans c.cpp)  :pt1cable:

Reply

Marsh Posté le 05-04-2005 à 20:14:32    

IrmatDen a écrit :

Monsieur, ;)
Tu peux nous mettre les premieres lignes de musique.h et musique.cpp stp ?


 
 
/************************** musique.h *******************************/
 
#include <string.h>
#include "../api/inc/wincompat.h"
#include "../api/inc/fmod.h"
#include "../api/inc/fmod_errors.h"  
 
#ifndef _MONFICHIER_H_MUSIQUE_
#define _MONFICHIER_H_MUSIQUE_
class Musique
{
private:
 char * acces;
 int module; /* 1=FMUSIC 2=FSOUND 3=SDL*/
 FMUSIC_MODULE *fm;
 FSOUND_SAMPLE *fs;  
 void extension();
public:
 Musique();
 void setAcces(const char * chemin);
 char * initialisation();
 char * lecture(const char * acces);
 void arret();
 void pause();
 void volume (int vol);
 void avanceRapide();
 void retourRapide();
 bool estFini();
};
#endif
 
 
/********************* Musique.cpp *************************/  
 
#include "musique.h"
 
void Musique::extension()
{
 [...]
}
 
Musique::Musique()
{
 fm = NULL;
 fs = NULL;
}
void Musique::setAcces(const char * chemin)
{
 [...]
}
char * Musique::initialisation()
{
 [...]
}
char * Musique::lecture(const char * acces)
{
 [...]
}
 
[...]


Message édité par Binoi le 05-04-2005 à 20:15:36
Reply

Marsh Posté le 05-04-2005 à 20:14:32   

Reply

Marsh Posté le 05-04-2005 à 20:24:57    

et la sortie complete du compileur pour musique.cpp ?
Sinon, je pense pas que ça résolve ton problème, mais les include tu devrais les faire apres ton #ifndef ... #define ...

Reply

Marsh Posté le 05-04-2005 à 20:29:44    

Voilà ce que me dit la sale bete de compilateur !!!  
 
g++    -c -o main.o main.cpp
g++    -c -o musique.o musique.cpp
musique.cpp: In member function `char* Musique::initialisation()':
musique.cpp:97: error: invalid use of undefined type `struct FMUSIC_MODULE'
../api/inc/fmod.h:48: error: forward declaration of `struct FMUSIC_MODULE'
musique.cpp:100: error: invalid use of undefined type `struct FSOUND_SAMPLE'
../api/inc/fmod.h:44: error: forward declaration of `struct FSOUND_SAMPLE'
musique.cpp: In member function `char* Musique::lecture(const char*)':
musique.cpp:110: error: invalid use of undefined type `struct FMUSIC_MODULE'
../api/inc/fmod.h:48: error: forward declaration of `struct FMUSIC_MODULE'
musique.cpp:112: error: invalid use of undefined type `struct FSOUND_SAMPLE'
../api/inc/fmod.h:44: error: forward declaration of `struct FSOUND_SAMPLE'
[...]
make: *** [musique.o] Erreur 1

Reply

Marsh Posté le 05-04-2005 à 21:15:17    

tu peux me faire un copier/coller de musique.h et musique.cpp en MP stp  que j'y jette un oeil ?


Message édité par IrmatDen le 05-04-2005 à 21:32:13
Reply

Marsh Posté le 05-04-2005 à 22:37:05    

oki, on était très loin du problème là !!
La librairie FMOD ne s'utilise absolument pas de cette façon. Regarde dans FMOD/samples/simple/Main.cpp, analyse un peu le fonctionnement de la librairie en regardant la doc pour chacune des fonctions... Si tu as besoin d'un éclaircissement, n'hésite pas... même si je pourrais pas t'aider énormément, vu que je connais pas cette lib.

Reply

Marsh Posté le 06-04-2005 à 09:22:05    

Justement, j'ai réussi à utiliser FMOD avec le compilateur gcc dans un exemple tout simple. Mais moi, ce que je voudrais, c'est pouvoir l'utiliser via une classe...

Reply

Marsh Posté le 06-04-2005 à 21:44:21    

Salut,
 
On va voir quelques erreurs ensemble alors :
 

Code :
  1. musique.cpp:59: error: invalid use of undefined type `struct FMUSIC_MODULE'


la dite ligne dans musique.cpp : fm = new FMUSIC_MODULE;
l'utilisation correcte : fm = FMUSIC_LoadSong("mamusique.mod" );
en vérifiant que fm est bien alloué, sinon tu signales une erreur à l'utilisateur de la classe.
 

Code :
  1. musique.cpp:62: error: invalid use of undefined type `struct FSOUND_SAMPLE'


Même erreur...
la dite ligne dans musique.cpp : fs = new FSOUND_SAMPLE;
l'utilisation correcte : fs = FSOUND_Sample_Load(FSOUND_UNMANAGED, "monson.wav", FSOUND_NORMAL, 0, 0);
en vérifiant que fs est bien alloué, sinon tu signales une erreur à l'utilisateur de la classe.
 

Code :
  1. musique.cpp:72: error: invalid use of undefined type `struct FMUSIC_MODULE'


ce que tu fais : return(fm->lecture());
Où as vu que FMOD étais développé en C++ et possédait un membre lecture() ??
Pour lancer la lecture d'un FMUSIC_MODULE, il faut : FMUSIC_PlaySong(fm); en ayant pris soin d'ajuster ton volume...
 
etc, etc...
 
Sinon pour la façon dont tu as l'air de développer ta classe, tu ne pourras jamais jouer plus d'une musique et plus d'un son à la fois. Tu aurais plus à gagner en créant au minimum 3 classes, genre:
- FMODSystem : classe servant à initialiser le système FMOD (i.e. version, sortie, memory system, erreurs, drivers...),
- FMODMusic : classe servant à gérer tout ce qui concerne les FMUSIC_MODULE,
- FMODSound : classe servant à gérer tout ce qui concerne les FSOUND_SAMPLE.
En prenant soin de faire des destructeurs pour tes classes pour bien nettoyer ton système parce que dans ton code il n'y avait pas ça :

Code :
  1. FSOUND_Sample_Free(fs);
  2. FMUSIC_FreeSong(fm);
  3. FSOUND_Close();


 
voili voilou, amuse toi bien ;)
 
PS: une dernière chose, laisse tomber tes char* et utilises des string, c'est bien plus simple à manipuler.

Reply

Marsh Posté le 07-04-2005 à 19:45:07    

Un grand merci pour ta réponse !!!!  :)  
 
J'ai bien compris mon problème.
J'avais déjà utilisé FMOD en C
mais là j'intègre tout ça dans une interface graphique donc, je me suis mis au C++ et à l'implementation des classes...
 
Mais donc, du coup ça risque de compliqué mon affaire.  
Je voulais décomposer les fonctions de la FMOD au travers de classes. Du coup, j'ai crée une classe Musique, dans laquelle il y a un objet de type FMUSIC et FSOUND (FMOD se décompose en 2 grande parties en fonctions du type du fichier lu mp3, s3m, etc).
J'ai donc crée des classes pour FMUSIC et FSOUND qui font appel à leur fonction respective dans la librairie FMOD.
Enfin bref, c'est un beau bordel.  :D  
 
C'est pas gagné...  :sarcastic:  
 

Reply

Marsh Posté le 07-04-2005 à 20:13:41    

Si tu commences tout juste en C++, alors il vaudrait peut-être mieux te pencher sur un bouquin ou un bon tuto. Comme ça, ton systeme de gestion de son sera bien orienté objet et en connaissance de cause...
Ca promet quelques belles nuits blanches ;)

Reply

Marsh Posté le 07-04-2005 à 20:22:33    

IrmatDen a écrit :

Si tu commences tout juste en C++, alors il vaudrait peut-être mieux te pencher sur un bouquin ou un bon tuto. Comme ça, ton systeme de gestion de son sera bien orienté objet et en connaissance de cause...
Ca promet quelques belles nuits blanches ;)


 
Et moi qui aime dormir....  :sleep:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed