CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

erreur lors de la compilation

shaken89
shaken89
Niveau 4
26 février 2008 à 13:35:54

Salut tout le monde j'obtiens une erreur lorsque je veux complier mon programme composé de 4 fichiers:

MP3.h:

  1. ifndef MP3_H
  2. define MP3_H
  3. include <iostream>
  4. include <string>

using namespace std;

class MP3
{
public:
MP3(string tch,string nomal="Non renseigne",string nomart="non renseigne",int nump,int sec,int size,int nbec);
void saisir();
void afficher();

private:
string titre_;
string album_;
string artiste_;
int numpiste_;
int duree_;
int taille_;
int nbecoute_;
};

  1. endif

le MP3.cpp:

  1. include "mp3.h"

MP3::MP3(string tch,string nomal,string nomart,int nump,int sec,int size,int nbec)
{
titre_=tch;
album_=nomal;
artiste_=nomart;
numpiste_=nump;
duree_=sec;
taille_=size;
nbecoute_=nbec;
}
void MP3::saisir()
{
char rep;
cout<<" saisissez le titre de la chanson : ";
cin>>titre_;
cout<<"Y a-t-il un nom d'album? O/N ?"<<endl;
cin>>rep;
while(rep!='o' && rep !='O' && rep!='N' && rep!='n')
{
cout<<"saisie incorrecte, retaper"<<endl;
cin>>rep;
}
if(rep=='o'|| rep=='O')
{
cout<<"saisissez donc le nom de l'album : ";
cin>>album_;
}
cout<<endl<<"saisissez maintenant le nom de l'artiste: ";
cin>>artiste_;
cout<<endl<<" Y a-t-il un numero de piste? O/N "<<endl;
cin>>rep;
while(rep!='o' && rep !='O' && rep!='N' && rep!='n')
{
cout<<"saisie incorrecte, retaper"<<endl;
cin>>rep;
}
if(rep=='o'|| rep=='O')
{
cout<<"saisissez donc le numero de piste : ";
cin>>numpiste_;
}
cout<<endl<<"saisissez maintenant la duree du morceau en secondes : ";
cin>>duree_;
while(duree_<1)
{
cout<<"impossible, veuillez retaper la duree : "<<endl;
cin>>duree_;
}
cout<<endl<<" saisissez la taille du morceau en Ko : ";
cin>>taille_;
while(taille_<1)
{
cout<<"impossible, veuillez retaper la taille : "<<endl;
cin>>taille_;
}

}

void MP3::afficher()
{
cout<<"\ttitre : "<<titre_<<endl;
cout<<"\tnom d'album : "<<album_<<endl;
cout<<"\tnom de l'artiste : "<<artiste_<<endl;
cout<<"\tnumero de piste : "<<numpiste_<<endl;
cout<<"\tduree du morceau : "<<duree_<<endl;
cout<<"\ttaille du morceau : "<<taille_<<endl;
cout<<"\tnombre d'ecoute(s) : "<<nbecoute_<<endl;
}

Maintentant le playlist.h:

  1. ifndef PLAYLIST_H
  2. define PLAYLIST_H
  3. include "mp3.h"

using namespace std;

const int MAX=100;

class Playlist
{
public:
Playlist(string n, MP3 t[],int nbc);
void saisir();
void afficher();

private:
string nom_;
MP3 tab[MAX];
int nbchansons_;
};

  1. endif

et enfin le playlist.cpp:

  1. include "playlist.h"

Playlist::Playlist(string n, MP3 t[],int nbc)
{
nom_=n;
nbchansons_=nbc;
for(int i=0;i<MAX;i++)
{
tab[i]=t[i];
}
};

void Playlist::saisir()
{
char rep;
cout<<"saisissez le nom de la playlist : ";
cin>>nom_;
cout<<endl<<"saissisez maintenant les differents Mp3's (au plus 100) :"<<endl;
int i=0;
do
{
cout<<"Mp3 numero "<<i+1<<endl;
tab[i].saisir();
cout<<" Voulez-vous encore entrer des Mp3's ( si oui taper O sinon une autre touche)?"<<endl;
cin>>rep;
i++;
}while((rep=='o' || rep=='O') && i<MAX);

nbchansons_=i;
};

void Playlist::afficher()
{
cout<<"\tNom de la playlist : "<<nom_<<endl;
for(int i=0;i<nbchansons_;i++)
{
cout<<"Morceau numero "<<i+1<<" : "<<endl;
tab[i].afficher();
}
cout<<endl<<" Dans cette playlist il y a "<<nbchansons_<< " chansons "<<endl;
};

et j'obtiens comme message d'erreur:
playlist.cpp line 4 error: no matching for call to 'MP3::MP3()'

mp3.h line 11 note:candidates are MP3::MP3(const MP3&)

mp3.h line 13 note:
MP3::MP3(std::string,std::string,int,int,int,int)

Merci de votre aide!

godrik
godrik
Niveau 30
26 février 2008 à 14:00:19

en effet, ton objet MP3 n'a pas de constructeur par defaut

blip
blip
Niveau 6
26 février 2008 à 14:19:38

je rajouterai que manipuler des objets directement, et non par pointeur est source d'erreurs.

quand la fonction :
Playlist::Playlist(string n, MP3 t[],int nbc)
est appelée, MP3 tab[MAX]; créé MAX objets MP3, la boucle :
for(int i=0;i<MAX;i++)
{
tab[i]=t[i];
}
les désalloue, puis créé MAX nouvel objet MP3, identiques à ceux contenus dans t.

Si tu utilises des MP3* à la place des MP3, tu ne copies que l'adresse des objets, tu n'appelles pas MP3::MP3() (qui n'existe pas au passage), et tu évites pas mal d'allocations/libérations de mémoire inutile.

dnob700
dnob700
Niveau 10
27 février 2008 à 00:23:49

non, l'appel à la fonction n'allouera rien du tout : dans ce cas là, "MP3 t[]" est exactement équivalent à "MP3* t". De même la boucle ne va ni allouer ni désallouer quoi que se soit, elle va juste appeler MAX fois l'opérateur de recopie par défaut de l'objet MP3 qui est juste une copie de bits, quoi que je ne sais pas si les opérateurs de recopie des string membre de MP3 sont appelés récursivement auquel cas il y a bien quelques allocations de mémoire. Il faudrait demander à quelqu'un qui connait mieux le C++ que moi.

Neoknight
Neoknight
Niveau 10
27 février 2008 à 00:33:08

on ne doit pas faire apparaitre les noms de variable dans le .h

Chaos_Clad
Chaos_Clad
Niveau 10
27 février 2008 à 02:15:38

Ah bon ?

________________________________________
Ma vidéo du moment :
http://vids.myspace.com/index.cfm?fuseaction=vids.individual&amp;videoid=27196783

blip
blip
Niveau 6
27 février 2008 à 02:43:32
  1. dnob700 Voir le profil de dnob700
  2. Posté le 27 février 2008 à 00:23:49 Avertir un modérateur
  3. non, l'appel à la fonction n'allouera rien du tout : dans ce cas là, "MP3 t[]" est exactement équivalent à "MP3* t". De même la boucle ne va ni allouer ni désallouer quoi que se soit, elle va juste appeler MAX fois l'opérateur de recopie par défaut de l'objet MP3 qui est juste une copie de bits, quoi que je ne sais pas si les opérateurs de recopie des string membre de MP3 sont appelés récursivement auquel cas il y a bien quelques allocations de mémoire. Il faudrait demander à quelqu'un qui connait mieux le C++ que moi.

=> Playlist::Playlist(...) étant un constructeur, un objet Playlist est créé, est donc "MP3 tab[MAX];" provoque l'allocation de MAX MP3, par le constructeur par défaut de MP3, ce qui provoque l'erreur qu'a reçu shaken89.
Pour la copie, je pensais qu'un destructeur était appelé quand on affectait directement un objet par dessus un objet déjà existant.

dnob700
dnob700
Niveau 10
27 février 2008 à 21:21:04

"Playlist::Playlist(...) étant un constructeur, un objet Playlist est créé, est donc "MP3 tab[MAX];" provoque l'allocation de MAX MP3, par le constructeur par défaut de MP3"

Ah oui, ok. je n'avais pas vu que tu parlais des MP3 membres de playlist. J'ai cru que tu disais ça du tableau passé en argument au constructeur qui serait passé "par valeur".

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment