IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Accès Variable template dans classe


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut Accès Variable template dans classe
    Bonjour,

    Je dois construire une classe Album qui reprendre un Vecteur template de Carte.
    La classe Album possède deux variables membres private: Le nom de l'album(char * NomAlbum) et le vecteur de carte(Vecteur<Carte> ve()).

    Le problème est que lorsque je surcharge mon opérateur '<<' afin de pouvoir afficher le nom de l'album et mon vecteur, je n'arrive pas à accéder à ma variable membre Vecteur.

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Album :: Album() //Constructeur
    {
    	NomAlbum="";
    	Vecteur<Carte>ve(30);
    	//ve.Affiche();
     
    }
    J'instance dans mon Main.cxx, le vecteur et le nom de l'album. Mais lors de ma surcharge je ne sais pas quoi mettre pour accéder a mon vecteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ostream & operator <<(ostream & s, const Album &al)
    {
     
     
    	s<<"Nom Album:"<<al.NomAlbum<<endl;
    	/*s<<al.  Afficher le Vecteur
     
     
     
    	return s;
     
    }
    Le nom d'album s'affiche bien mais je ne sais pas ce que je dois mettre après al.*** pour pouvoir accéder au vecteur de l'objet que j'ai instancié...

    Quelqu'un aurait il une idée?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut!
    1. utilises plutot la classe string qu'un char* pour représenter le nom
    2. un std::vector n'a aucun opérateur << défini par défaut, il faut donc veiller, dans ton opérateur <<, à bouclier sur l'ensemble des éléments qu'il contient (et veiller à ce que le type que le std::vector contient dispose lui aussi de l'opérateur << )
    3. utilises de préférence les listes d'initialisation dans ton constructeur
    4. pourrais tu nous fournir la définition de la classe Album
    5. Pourrais tu nous fournir la définition de la classe Carte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Bonjour,

    Effectivement, tu ne peux pas mettre directement si tu n'as pas d'opérateur surchargé pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream & operator <<(ostream & s, const Vecteur<Carte> &ve)
    . Encore faut-il savoir ce que veux afficher lorsque tu appellerais cet opérateur. Le contenu de tout le Vecteur ? Dans ce cas, tu risques de devoir surcharger aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream & operator <<(ostream & s, const Carte &c)
    lorsque tu vas itérer sur ton vecteur pour en afficher les éléments.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Voici la classe carte
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
     
     
    #include"Carte.h"
    Carte::Carte()
    {	
    	NomCarte[0]=0;
    	NomSerie="";
    /*
    	OU
    	NomSerie=new char[1];
    	NomSerie[0]=0;
    */
    	Numero=0;
    	CarSco;
    }
     
    Carte::Carte(char * nomc,char * noms,int num,char * NomCaract,int score)
    {	
    	strcpy(NomCarte,nomc);
    	NomSerie=new char[strlen(noms)+1];
    	strcpy(NomSerie,noms);
    	Numero=num;
    	CarSco.setNomCaract(NomCaract);
    	CarSco.setScore(score);
    }
    Carte::Carte(char * nomc,char * noms,int num,CaractScore cs)
    {	
    	strcpy(NomCarte,nomc);
    	NomSerie=new char[strlen(noms)+1];
    	strcpy(NomSerie,noms);
    	Numero=num;
    	CarSco=cs;
    }
    Carte::Carte(char * nomc)
    {
    	strcpy(NomCarte,nomc);
    	NomSerie=new char[1];
    	NomSerie[0]=0;
    	Numero=0;
    	CarSco;
     
    }
    Carte::Carte(const Carte & c)
    {
    	strcpy(NomCarte,c.NomCarte);
    	NomSerie=new char[strlen(c.NomSerie)+1];
    	strcpy(NomSerie,c.NomSerie);
    	Numero=c.Numero;
    	CarSco=c.CarSco;
    }
     
    void Carte::setNomCarte(char * nomc)
    {
    	strcpy(NomCarte,nomc);
    }
    void Carte::setNomSerie(char * noms)
    {
    	NomSerie=new char[strlen(noms)+1];
    	strcpy(NomSerie,noms);
    }
     
    void Carte::setNumero(int num)
    {
    	Numero=num;
    }
    void Carte::setCaractScore(char * NomCaract,int score)
    {
    	CarSco.setNomCaract(NomCaract);
    	CarSco.setScore(score);
    }
    void Carte::setCaractScore(CaractScore cs)
    {
    	CarSco=cs;
    }
    char * Carte::getNomCarte()
    {
    	return NomCarte;
    }
    char * Carte::getNomSerie()
    {
    	return NomSerie;
    }
    int Carte::getNumero()
    {
    	return Numero;
    }
    CaractScore Carte::getCaractScore()
    {
    	return CarSco;
    }
    void Carte::Affiche()
    {
    	cout<<"Nom de la carte: "<<NomCarte<<endl;
    	cout<<"Nom de la serie: "<<NomSerie<<endl;
    	cout<<"Numero de la carte: "<<Numero<<endl;
    	CarSco.Affiche();
    }
    /*
    ostream & operator <<(ostream & s,const Carte &c)
    {
    	s<<"Nom de la carte: "<<c.NomCarte<<endl;
    	s<<"Nom de la serie: "<<c.NomSerie<<endl;
    	s<<"Numero de la carte: "<<c.Numero<<endl;
    	s<<c.CarSco;
    	return s;
    }
    */
    ostream & operator <<(ostream & s,const Carte &c)
    {
    	ostream * ptostream=&s;
    // attention si on travaille avec des fstream (voir main), ne surtout pas declarer ptofstream comme un pointeur de ofstream
    	fstream * ptofstream=dynamic_cast <fstream *> (ptostream);
    	if(ptofstream)
    	{
    		(*ptofstream)<<c.NomCarte<<endl;
    		(*ptofstream)<<c.NomSerie<<endl;
    		(*ptofstream)<<c.Numero<<endl;
    		(*ptofstream)<<c.CarSco;
    	}
    	else
    	{
    		s<<"Nom de la carte: "<<c.NomCarte<<endl;
    		s<<"Nom de la serie: "<<c.NomSerie<<endl;
    		s<<"Numero de la carte: "<<c.Numero<<endl;
    		s<<c.CarSco;
    	}
     
    	return s;
    }
    /*
    istream & operator >>(istream & s, Carte &c)
    {
    	cout<<"Nom de la carte? ";
    	s>>c.NomCarte;
    	char temp[20];
    	cout<<"Nom de la serie? ";
    	s>>temp;
    	c.setNomSerie(temp);
    	cout<<"Numero de la carte? ";
    	s>>c.Numero;
    	return s;
    }
    */
    istream & operator >>(istream & s, Carte &c)
    {
    	istream * ptistream=&s;
    // attention si on travaille avec des fstream (voir main), ne surtout pas declarer ptifstream comme un pointeur de ifstream mais comme un pointeur de fstream
     
    	fstream * ptifstream=dynamic_cast <fstream *> (ptistream);
     
    	if(ptifstream)
    	{
    		char temp[30];
    		char car;
    /*		REMARQUE IMPORTANTE
    		//avec l'instruction ci-dessous, le \n reste ds le buffer
    		(*ptifstream)>>c.NomCarte;
    		(*ptifstream).get(car);
    		//cout<<"char="<<car;
    */		
    		(*ptifstream).getline(c.NomCarte,30);
    		//avec l'instruction ci-dessous, le \n est lu (ne reste pas ds le buffer) et ds temp, il est écrase par \0
    		(*ptifstream).getline(temp,30);
    		c.setNomSerie(temp);
    		(*ptifstream)>>c.Numero;
    		(*ptifstream).get(car);
    		(*ptifstream)>>c.CarSco;
    	}
    	else
    	{
    		char car;	
    		cout<<"Nom de la carte? ";
    		s.getline(c.NomCarte,30);
    		char temp[30];
    		cout<<"Nom de la serie? ";
    		s.getline(temp,30);
    		c.setNomSerie(temp);
    		cout<<"Numero de la carte? ";
    		s>>c.Numero;
    		s>>c.CarSco;
    	//s.get(car) sinon qd je lis 2 cartes à la suite l'une de l'autre, ne me permettait pas d'entrer le nom de la carte lors de la lecture de la deuxième carte
    		s.get(car);	
    	}
    }
    /*
    // pour eviter que la lecture ne s'arrete au 1er blanc
    istream & operator >>(istream & s, Carte &c)
    {
    	char car;	
    	cout<<"Nom de la carte? ";
    	s.getline(c.NomCarte,30);
    	char temp[30];
    	cout<<"Nom de la serie? ";
    	s.getline(temp,30);
    	c.setNomSerie(temp);
    	cout<<"Numero de la carte? ";
    	s>>c.Numero;
    	s>>c.CarSco;
    	//s.get(car) sinon qd je lis 2 cartes à la suite l'une de l'autre, ne me permettait pas d'entrer le nom de la carte lors de la lecture de la deuxième carte
    	s.get(car);
    	return s;
    }
    */
    int Carte::IdentNomCaract(Carte c)
    {
    	if(CarSco.IdentNomCaract(c.CarSco))
    		return 1;
    	return 0;
    }		
    Carte & Carte::operator=(const Carte & c)
    {
    	strcpy(NomCarte,c.NomCarte);
    	NomSerie=new char[strlen(c.NomSerie)+1];
    	strcpy(NomSerie,c.NomSerie);
    	Numero=c.Numero;
    	CarSco=c.CarSco;
    	return *this;
    }
     
    Carte Carte::operator+(int s)
    {
    	Carte c(*this);
    	c.CarSco=c.CarSco+s;
    	return c;
    }
     
    Carte Carte::operator-(int s)
    {
    	Carte c(*this);
    	c.CarSco=c.CarSco-s;
    	return c;
    }
     
    Carte Carte::operator+(Carte c)
    {
    	Carte cart(*this);
    	cart.CarSco=cart.CarSco+c.CarSco;
    	return cart;
    }
     
    int Carte::operator-(Carte c)
    {
    	int s;
    	s=CarSco-c.CarSco;
    	return s;
    }
     
    int Carte::operator<(Carte &c)
    {
    	if(CarSco<c.CarSco)
    		return 1;
    	return 0;
    }
     
    int Carte::operator>(Carte &c)
    {
    	if(CarSco>c.CarSco)
    		return 1;
    	return 0;
    }
     
    Carte Carte::operator++()
    {
    	CarSco++;
    	return *this;
    }
     
    Carte Carte::operator++(int)
    {
    	Carte c(*this);
    	CarSco++;
    	return c;
    }
    int Carte::operator!=(Carte & c)
    {
    	if(strcmp(NomSerie,c.NomSerie)!=0 || Numero!=c.Numero)
    		return 1;
    	return 0;
    }
    et la classe album(en construction toujours )
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    #include "Album.h"
    #include "Vecteur.h"
    #include "Carte.h"
    Album :: Album()
    {
    	NomAlbum="";
    	Vecteur<Carte>ve(30);
    	//ve.Affiche();
     
     
     
    }
     
     
    Album :: Album(char *Na)
    {
    	NomAlbum = new char[strlen(Na)+1];
    	strcpy(NomAlbum,Na);
    	strcat(NomAlbum,".txt");
     
    	fstream f;
    	f.open(NomAlbum,ios::in);
       if(!f.rdbuf()->is_open())
    	{
    		cout<<"Open Fichier Error"<<endl;
    		exit(1);
     
    	}     
     
     
    	Vecteur<Carte>ve(20);
    	Carte c;
    	char string[120];
    	int Num;
    	int i;
    	int j;
    	char var[30];
    	char var2[30];
    	char var3[30];
    	char var4[30];
    	char var5[15];
    	while(!(f.eof()))
    	{
    		f>>string;
    		for (i = 0; string[i] != ':'; i++)
     			var[i] = string[i];
     
    		var[i] = '\0';
    		i++;
    		int numero = atoi(var);
    		//cout<<numero<<endl;
    		c.setNumero(numero);
     
    		for (j = 0; string[i] != ':'; i++, j++)
     			var2[j] = string[i];
     
    		var2[j] = '\0';
    		//cout<<var2<<endl;
    		c.setNomCarte(var2);
     
    		i++;
    		for(j=0;string[i]!= ':'; i++,j++)
    			var3[j] = string[i];
     
    		var3[j] = '\0';
    		//cout<<var3<<endl;
    		c.setNomSerie(var3);
    		i++;
     
    		for(j=0;string[i]!= ':'; i++,j++)
    			var4[j] = string[i];
     
    		var4[j]='\0';
    		//cout<<var4<<endl;
     
    		i++;
     
    		for(j=0;string[i]!= '\0'; i++,j++)
    			var5[j] = string[i];
     
    		var5[j]='\0';
    		int score= atoi(var5);
    		c.setCaractScore(var4,score);
    		//cout<<c<<endl;
    		ve+c;
    		//cout<<score<<endl;
    	}
     
    	ve.Affiche();
    	f.close();
    }
     
    Album :: Album(const Album & Al)
    {
    	NomAlbum = new char[strlen(Al.NomAlbum)+1];
    	strcpy(NomAlbum,NomAlbum);
    	Vecteur<Carte>ve(10);
    	cout<<"CONSTRUCTEUR"<<endl;
    }
     
    void Album :: setNomAlbum(char *na)
    {
    	NomAlbum = new char[strlen(na)+1];
    	strcpy(NomAlbum,na);
    }
     
    /*void Album :: setNumero(int n)
    {
    	Numero = n;
    }*/
     
    bool Album :: load()
    {
    	//f.clear();
    	strcat(NomAlbum,".txt");
    	fstream f;
    	f.open(NomAlbum,ios::in);
       if(!f.rdbuf()->is_open())
    	{
    		cout<<"Open Fichier Error"<<endl;
    		exit(1);
     
    	}     
     
     
    	Vecteur<Carte>ve(20);
    	Carte c;
    	char string[120];
    	int Num;
    	int i;
    	int j;
    	char var[30];
    	char var2[30];
    	char var3[30];
    	char var4[30];
    	char var5[15];
    	f>>string;
    	while(!f.eof())
    	{
    	//	f>>string;
    		for (i = 0; string[i] != ':'; i++)
     			var[i] = string[i];
     
    		var[i] = '\0';
    		i++;
    		int numero = atoi(var);
    		//cout<<numero<<endl;
    		c.setNumero(numero);
     
    		for (j = 0; string[i] != ':'; i++, j++)
     			var2[j] = string[i];
     
    		var2[j] = '\0';
    		//cout<<var2<<endl;
    		c.setNomCarte(var2);
     
    		i++;
    		for(j=0;string[i]!= ':'; i++,j++)
    			var3[j] = string[i];
     
    		var3[j] = '\0';
    		//cout<<var3<<endl;
    		c.setNomSerie(var3);
    		i++;
     
    		for(j=0;string[i]!= ':'; i++,j++)
    			var4[j] = string[i];
     
    		var4[j]='\0';
    		//cout<<var4<<endl;
     
    		i++;
     
    		for(j=0;string[i]!= '\0'; i++,j++)
    			var5[j] = string[i];
     
    		var5[j]='\0';
    		int score= atoi(var5);
    		c.setCaractScore(var4,score);
    		//cout<<c<<endl;
    		ve+c;
    		f>>string;
    		//cout<<score<<endl;
    	}
     
    	ve.Affiche();
    	f.close();
    	return true;
    } 
     
    void Album :: save()
    {
    	/*NomAlbumcopy = new char[strlen(NomAlbum)+1];
    	strcpy(NomAlbumcopy,NomAlbum);*/
     
    	strcat(NomAlbum,".alb");
    	cout<<NomAlbum<<endl;
     
    	fstream f;
    	f.open(NomAlbum, ios::out| ios::ate);
    	if(!f.rdbuf()->is_open())
    	{
    		cout<<"File Error"<<endl;
    		exit(1);
    	}
     
     
    }
     
    ostream & operator <<(ostream & s, const Album &al)
    {
    	ostream * ptostream=&s;
    	fstream * ptofstream = dynamic_cast <fstream *> (ptostream);
    	if(ptofstream)
    	{
     
    		(*ptofstream)<<al.NomAlbum<<endl;
    	}
    	else
    	{
     
    		s<<"Nom Album:"<<al.NomAlbum<<endl;
    		al.Affiche();
     
     
    	}
    	return s;
     
    }
     
    void Album :: Affiche()
    {
     
    	if(empty())
    	{
    		cout<<"Vecteur Vide"<<endl;
    		return;
    	}
     
    	int nb=0;
    	for(int i=0;i<=Taille;i++)
    	{
    		if(*(Presence+i)==1)
    		{
    			cout<<"Indice->"<<i<<"<-"<<endl;
     
    			cout<<*(Data+i)<<endl;
    			nb++;
    		}
    		if(nb==NbElem)
    			return;
    	}
    	return;
    }
     
    istream & operator >>(istream &s, Album &al)
    {
    	char car;
    	istream * ptistream = &s;
    	fstream * ptifstream = dynamic_cast<fstream*>(ptistream);
    	if (ptifstream)
    	{
     
    		char buf[30];
    		//cout<<"Login?";
    		(*ptifstream)>>buf;
    		(*ptifstream).get(car);
    		al.setNomAlbum(buf);
    	}
    	else
    	{
     
     
    		cout<<"Nom Album: ";
    		char buf[30];
    		s>>buf;
    		al.setNomAlbum(buf);
    		s.get(car);
    		int nbre;
    		Carte c;
    		s>>c;
    		//Vecteur<Carte>ve(15);
    		//ve+c;
    		al.setElement(c);
    		al.Affiche();
    		//al.Affiche();
    		//ve.Affiche();
    		//al.ve();
     
    	}
    	return s;
     
    }
    sinon je pense qu'en effet je vais devoir surcharger l'operateur "<<" de ma classe vecteur.

    Merci déja pour votre aide

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    J'ai fait une fonction Affiche() dans ma classe vecteur, je vous la met ici
    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
    template <class VT> void Vecteur <VT>::Affiche()
    {
    	if(empty())
    	{
    		cout<<"Vecteur Vide"<<endl;
    		return;
    	}
     
    	int nb=0;
    	for(int i=0;i<=Taille;i++)
    	{
    		if(*(Presence+i)==1)
    		{
    			cout<<"Indice->"<<i<<"<-"<<endl;
     
    			cout<<*(Data+i)<<endl;
    			nb++;
    		}
    		if(nb==NbElem)
    			return;
    	}
    	return;
    }
    l'ayant bien virtualisé et redéclaré dans ma classe Album, est-ce que je pourrai la réutiliser dans ma fonction ostream & operator <<(ostream & s, const Album &al)?

    Le souci c'est que je ne sais pas comment l'appeler...

    car si je rajoute--->
    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
    ostream & operator <<(ostream & s, const Album &al)
    {
    	ostream * ptostream=&s;
    	fstream * ptofstream = dynamic_cast <fstream *> (ptostream);
    	if(ptofstream)
    	{
     
    		(*ptofstream)<<al.NomAlbum<<endl;
    	}
    	else
    	{
     
    		s<<"Nom Album:"<<al.NomAlbum<<endl;
    		al.Affiche();
     
     
    	}
    	return s;
    Ceci ne marche pas...

    Je doit impérativement surchargé l'opérateur << dans la classe Vecteur?

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Si je peux me permettre, je te conseille d'éviter d'utiliser les chaines C (char*) au profit de std::string, qui est beaucoup plus simple et sûre d'emploi. D'ailleurs, que de pointeurs dans ton code ! Je ne pense pas que tu en aies besoin d'autant.

    Avais-tu besoin de définir ta propre classe Vecteur plutôt que d'utiliser std::vector ? C'est pour un devoir d'école ?
    Pourquoi dis-tu qu'Affiche est "virtualisée et redéclarée dans ma classe Album" ? Album hérite de Vecteur ? Pourtant Album contient lui-même un Vecteur, non ?

    Enfin, pour répondre à ta question, le contenu de la surcharge de ton opérateur << pour ta classe Vecteur sera similaire à celui de ta méthode Affiche(), sauf qu'au lieu d'envoyer vers cout, tu envoies vers le ostream qui est passé en premier paramètre.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Si je peux me permettre, je te conseille d'éviter d'utiliser les chaines C (char*) au profit de std::string, qui est beaucoup plus simple et sûre d'emploi. D'ailleurs, que de pointeurs dans ton code ! Je ne pense pas que tu en aies besoin d'autant.
    C'est vraiment par habitude, mais c'est vrai que c'est plus sur d'utilise string.


    Oui c'est un projet a presenter a l'examen. Oui car j'ai mis la fonction Vecteur :: Affiche() en virtual. Et vu que j'ai fait classe Album : public Vecteur, album hérite de la classe vecteur.

    Enfin, pour répondre à ta question, le contenu de la surcharge de ton opérateur << pour ta classe Vecteur sera similaire à celui de ta méthode Affiche(), sauf qu'au lieu d'envoyer vers cout, tu envoies vers le ostream qui est passé en premier paramètre.
    Merci pour l'explication je vais essayer ça.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Voila j'ai surchargé l'opérateur << de ma classe Vecteur comme ceci
    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
    Vecteur.cxx
    ostream & operator <<(ostream & s, const Vecteur<Carte> &ve)
    {
       
    	int nb=0;
    	for(int i=0; i<ve.Taille; i++)
    	{	
    		
    			s<<*(ve.Data);
    			nb++;
    		if(ve.NbElem == nb)
    		{
    			return s;
    		}
    	}
    	return s;
    }
    Je l'ai testé directement dans le main en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Main.cxx
    Vecteur <Carte> ve(15);
    	cout<<ve;
    Et cela marche sans problème.

    Seulement dans la surcharge d'operateur << de ma classe album je n'arrive toujours pas à afficher mon vecteur alors que je fais essentiellement la même chose...

    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
    Album.cxx
    ostream & operator <<(ostream & s, const Album &al)
    {
    	ostream * ptostream=&s;
    	fstream * ptofstream = dynamic_cast <fstream *> (ptostream);
    	if(ptofstream)
    	{
    		
    		(*ptofstream)<<al.NomAlbum<<endl;
    	}
    	else
    	{
    		
    		s<<"Nom Album:"<<al.NomAlbum<<endl;
    		s<<al.ve;
    
    		
    	}
    	return s;
    
    }
    Est-ce ma syntaxe dans Album.cxx qui fait défaut?

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    En fait, je demandais la définition des classes Album et Carte, et non la définition de leurs fonctions membres (histoire de voir de quoi elles sont faites )
    Citation Envoyé par fex79 Voir le message
    C'est vraiment par habitude, mais c'est vrai que c'est plus sur d'utilise string.
    Je ne te le fais pas dire
    Oui c'est un projet a presenter a l'examen. Oui car j'ai mis la fonction Vecteur :: Affiche() en virtual. Et vu que j'ai fait classe Album : public Vecteur, album hérite de la classe vecteur.
    Sauf que 'il semblerait que ta classe Album dispose d'un membre de type Vecteur<carte>, et que cela fait clairement double emploi avec l'héritage publique

    De plus, il faut se rappeler que l'héritage publique est la relation la plus forte qui puisse exister entre deux classes, et je ne suis personnellement pas intimement persuadé que l'on puisse réellement dire qu'un Album EST-UN Vecteur<Carte> (au sens sémantique du terme):

    Déjà, les fonctions membres virtuelles font rarement bon ménage avec les classes template, surtout si la classe template se trouve en haut d'une hiérarchie de classes, entre autres parce que les fonctions membres des classes template seront ou devront être inlinées, mais aussi parce la généricité évalue les type à la compilation, alors que les fonctions virtuelles évaluent les types à l'exécution

    De plus, on peut estimer que ce que tu attend de Vecteur<Type>, c'est essentiellement d'être en mesure de stocker un nombre donné d'élément de type Type, et donc de fournir un ensemble de services correspondant (ajout, suppression, insertion, accès de ou à un ou plusieurs élément( s ) ) alors que l'on peut estimer que la responsabilité d'un Album est plutôt de représenter un ensemble de Carte dont il se fait, mais on aurait très bien pu en décider autrement, que la "gestion interne" est prise en charge par un Vecteur<Carte>

    On ne s'étonnera sans doute pas de constater que Album expose des fonctions telles que ajouterCarte, retirerCarte ou compteCarte qui feront appel aux fonctions membre du Vecteur<Carte> sous jascent, mais on s'étonnera malgré tout pas que leur noms puissent être différents (aucune référence au fait qu'il contient des carte ne sera faite dans Vecteur, vu qu'il peut contenir tout autre chose )

    Enfin, pour respecter le SRP (Single Responsibility Principle, ou, si tu préfères en Français : principe de responsabilité unique) si ta classe Vecteur a la responsabilité de gérer un ensemble d'éléments, elle ne devrait pas prendre la responsabilité de leur affichage, pas plus que ta classe Album si sa responsabilité est de représenter un ensemble de carte.

    Pour la même raison, ta classe Album ne devrait d'ailleurs pas non plus avoir la responsabilité de la lecture d'un fichier (et encore moins celle qui consisterait à obtenir / maintenir le nom du fichier à lire )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par koala01 Voir le message
    En fait, je demandais la définition des classes Album et Carte, et non la définition de leurs fonctions membres (histoire de voir de quoi elles sont faites )


    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
    #include "Carte.h"
    #include "Vecteur.h"
    #include "string.h"
    #include<iostream>
    #include<fstream>
    using namespace std;
    class Album : public Vecteur<Carte>
    {
    	protected:
    				char *NomAlbum;
    				Vecteur<Carte>ve();
    	public:
    			Album();
    			Album(char *Na);
    			Album(const Album & Al);
    			void setNomAlbum(char *na);
    			void setNumero(int n);
    			bool load();
    			void save();
    			void Affiche();
    			friend istream & operator >>(istream &s, Album &al);
    			friend ostream & operator <<(ostream & s, const Album &al);
    };
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    #ifndef _CARTE
     
    #define _CARTE
     
     
     
    #include <string.h>
     
    #include <iostream>
    #include <fstream>
     
    #include "CaractScore.h"
     
     
     
    using namespace std; 
     
     
     
    class Carte
     
    {
     
    protected:
     
    	char NomCarte[30];
     
    	char *NomSerie;
     
    	int Numero;
     
       CaractScore Caract;
     
     
     
    public:
     
       Carte(); 
     
       Carte(char *nomc);
     
    	Carte(char *nomc, char *noms, int num);
     
       Carte(char *nomc, char *noms, int num, CaractScore caract);
     
       Carte(char *nomc, char *noms, int num, char *caract, int Score);
       Carte(const Carte &c);
     
       ~Carte() 
     
       {
     
          if (NomSerie)
     
             delete NomSerie;
       }
     
     
     
    void setNomCarte(char *);
     
    void setNomSerie(char *);
     
    void setNumero(int);
     
    void setCaractScore(char *, int);
     
    void setCaractScore(int);
     
    void setCaractScore(CaractScore);
     
     
     
    char *getNomCarte() const;
     
    char *getNomSerie() const;
     
    int getNumero() const;
     
    int getScore() const;
    CaractScore getCaractScore();
     
     
    void Affiche();
     
     
     
    int IdentNomCaract(Carte &c2);
     
     
     
    Carte operator=(const Carte &c);
     
    Carte operator+(int num);
     
    Carte operator-(int num);
     
    int operator-(Carte & c2);
     
    int operator<(Carte & c2);
    int operator!=(Carte &C2);
     
    Carte operator++();
     
    Carte operator++(int);
     
     
     
    //Defnition des caractères >> et <<
     
    friend ostream & operator << (ostream &s, const Carte &c);
     
    friend istream & operator >> (istream &s, Carte &c);
     
    };
     
    #endif
    Merci de cet réponse très explicative.

    Je vais essayer en retirant l'héritage de Album:public Vecteur et voir ce que ca donne

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Sinon je te met l'enoncé donné pour la partie de mon projet qui doit gérer l'album. Ca sera p-e plus clair sur mes intentions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    3.4.1    Album
    Le  ConcepteurAlbum  peut  créer  plusieurs  albums.  Par  contre,  il  ne  peut  en  gérer 
    qu'un seul à la fois. On instanciera donc un seul objet de la classe Album. Celle-ci est décrite 
    par : 
    • un nom (un objet de la classe string) 
    • un vecteur (Vecteur) de cartes (Carte) dans lequel les cartes sont insérées par 
    ordre de numéro. 
    La méthode d'affichage de l'album affiche toutes les données de celui-ci, y compris la 
    liste complète des cartes qui le compose.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 01/01/2013, 19h10
  2. Template dans classe abstraite
    Par Kaluza dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2011, 07h17
  3. [PHP 5.3] Accés variable d'une classe
    Par Général03 dans le forum Langage
    Réponses: 6
    Dernier message: 19/08/2011, 09h25
  4. Syntaxe fonction template dans classe template
    Par Aleph69 dans le forum C++
    Réponses: 6
    Dernier message: 15/07/2011, 15h32
  5. Méthode template dans classe non template ?
    Par shenron666 dans le forum Langage
    Réponses: 12
    Dernier message: 04/09/2006, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo