Aller au contenu

[C++]Copie string


atfximen

Messages recommandés

EDIT: Copie de string:

VOIR POST 4!!!

[Resolu]

Salut à tous,

je dois faire un projet pour l'école, mais je n'ai pas bien capté (voire pas du tout) les constructeurs. Celui par défaut, ça va, mais celui d'initialisation et de copie :-D

Si quelqu'un pouvait me donner un brin d'explication ce serait cool, merci.

Lien vers le commentaire
Partager sur d’autres sites

Un constructeur, c'est la méthode qui permet d'initialiser un nouvel objet. Selon ses besoins en matière d'initialisation, un programmeur peut coder :

  • un constructeur "par défaut" ou "no-arg", qui ne fait rien de plus que créer l'objet; ses propriétés sont celles par défaut;
  • un ou plusieurs constructeurs avec des arguments, pour créer l'objet et initialiser ses propriétés avec des valeurs fournies en paramètre;
  • un constructeur "par copie", qui prend en paramètre un objet du même type, dont on se sert pour initialiser les propriétés du nouvel objet. Pratique quand on veut créer un objet qui "ressemble" à un autre.

Lien vers le commentaire
Partager sur d’autres sites

Me revoilà.

Pour ce qui est des consctructeurs, j'ai maintenant bien compris, encore merci.

Le point suivant est l'aggrégation de classes, que j'ai compris aussi, mais que je ne sais pas comment appliquer.

J'ai donc une classe PieceMusee, dans laquelle j'ai: un numéro de série de la pièce, une catégorie, ...

Dans une seconde classe "identifiant", je dois récupérer la catégorie enregistrée dans la classe PieceMusee.

class Identifiant
{
private:
		  PieceMusee*piece;
public:
		 PieceMusee*getPieceMusee()const {return piece;}
}

Est ce que ma déclaration est correcte?

Si oui, comment dois je ensuite faire pour récupérer la catégorie de la PieceMusee enregistrée?

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

J'ai donc une classe PieceMusee, dans laquelle j'ai: un numéro de série de la pièce, une catégorie, ...

Dans une seconde classe "identifiant", je dois récupérer la catégorie enregistrée dans la classe PieceMusee.

class Identifiant
{
private:
		  PieceMusee*piece;
public:
		 PieceMusee*getPieceMusee()const {return piece;}
}

[...]

Si oui, comment dois je ensuite faire pour récupérer la catégorie de la PieceMusee enregistrée?

Ben tu vas créer ton identifiant, ensuite récupérer la pièce avec la méthode qui va bien, et demander la catégorie à l'aide de ce pointeur.

Donc quelque chose comme ça à mon avis :

#include <iostream>

typedef enum
{
 CASQUE,
 MOMIE,
 UNKNOWN
} Category;

class Piece
{
 private:
Category _category;
 public:
Piece(Category category = UNKNOWN) : _category(category) {}
inline Category getCategory() { return _category; }
};

class Id
{
 private:
Piece *_piece;
 public:
Id(Piece *piece) : _piece(piece) {}
inline Piece *getPiece() { return _piece; }
};

int main()
{
 Piece *maPiece = new Piece(MOMIE);
 Id *monId = new Id(maPiece);
 std::cout << "Categorie n°" << monId->getPiece()->getCategory() << std::endl;
 return 0;
}

Lien vers le commentaire
Partager sur d’autres sites

Merci, je vais essayer de développer cela.

J'avais également trouvé ceci:

class Identifiant
{
private:
		string identifiant,cat,date;
		int cpt;

public:
	   int getCpt() {return cpt;}
	   void setCpt() {cpt++;}
	   void toString(PieceMusee);

	   Identifiant(void); //Constructeur par défaut.
};

class PieceMusee
{
private:			  
		   float valeur;			
					   string num,categorie,expose,peutpret,datein;		
public:
		   string getNum() {return num;}											   void setNum(string x) {num=x;}				 
		   string getCat() {return categorie;}
		   void setCat(string x) {categorie=x;}		  
			   string getExpo() {return expose;}	
											   void setExpo(string x) {expose=x;}	
		   [...]
};		

int main()
{
PieceMusee piece;
Identifiant id;
piece.saisie();
id.toString(piece);
piece.affichage();
return 0;
}

void Identifiant::toString(PieceMusee piece)
{
int cpt;
string cat;
cpt=getCpt();
cout<<cpt<<endl;
getchar();
cat=piece.getCat();
cout<<cpt << cat<<endl;
getchar();
}

Et cale fonctionne également, mais je pense que ce n'est pas une aggrégation...

C'est une méthode un peu simple et barbare de procéder, non?

Merci en tout cas pour le bout de code fourni :yes:

Lien vers le commentaire
Partager sur d’autres sites

J'avais également trouvé ceci:

[...]

Et cale fonctionne également, mais je pense que ce n'est pas une aggrégation...

C'est une méthode un peu simple et barbare de procéder, non?

J'ai pas bien compris le principe, mais déjà à la base "identifiant" n'est pas assez explicite pour pouvoir être traduit en code directement, donc il faut savoir ce qu'on entend par là.

Lien vers le commentaire
Partager sur d’autres sites

J'avais également trouvé ceci:

[...]

Et cale fonctionne également, mais je pense que ce n'est pas une aggrégation...

C'est une méthode un peu simple et barbare de procéder, non?

J'ai pas bien compris le principe, mais déjà à la base "identifiant" n'est pas assez explicite pour pouvoir être traduit en code directement, donc il faut savoir ce qu'on entend par là.

Tu veux savoir ce que j'entends pas identifiant?

Si oui, c'est en fait la clé primaire de la pièce de musée.

Elle doit être composée des trois premières lettres de la catégorie, de l'année d'entrée au musée et d'un compteur (remis à 0 lorsqu'une nouvelle année débute).

Lien vers le commentaire
Partager sur d’autres sites

en me basant sur le code que tu as fais, un truc comme ca :

#include <string>
#include <iostream>


using namespace std;

class PieceMusee
{
private:

	class Identifiant
	{

		public:
			string categorie,datein;
			int cpt;

			static string derniereAnnee;
			static int increment;

		public:

			Identifiant(const PieceMusee * obj) {
				this->categorie = obj->categorie.substr(0,3);
				if( !PieceMusee::Identifiant::increment ) {
					PieceMusee::Identifiant::derniereAnnee = obj->datein.substr(0,4);
				}

				this->cpt = (
					(
						PieceMusee::Identifiant::derniereAnnee == (
							this->datein = obj->datein.substr(0,4)
						)
					) ?
					(++PieceMusee::Identifiant::increment) :
					(PieceMusee::Identifiant::increment = 1)
				);

				if( this->cpt == 1 )
					PieceMusee::Identifiant::derniereAnnee = obj->datein.substr(0,4);


			}

	} * identifiant;

	float valeur;
	string num,categorie,expose,peutpret,datein;

public:

	string getNum() {return num;}
	void setNum(string x) {num=x;}
	string getCat() {return categorie;}
	void setCat(string x) {categorie=x;}
	string getExpo() {return expose;}
	void setExpo(string x) {expose=x;}
	string getPeutpret() {return peutpret;}
	void setPeutpret(string x) {peutpret=x;}
	string getDate() {return datein;}
	void setDate(string x) {datein=x;}

	string getIdentifiantCategorie() {return identifiant->categorie;}
	string getIdentifiantDatein() {return identifiant->datein;}
	int getIdentifiantCpt() {return identifiant->cpt;}

	// A appeller quand ta piece a ete saisie, sinon, bug
	void setIdentifiant() {identifiant = new Identifiant(this);}


};

int PieceMusee::Identifiant::increment = 0;
string PieceMusee::Identifiant::derniereAnnee = "0";


//#include "tempmoi.h"


int main()
{
PieceMusee piece;

piece.setNum("1");
piece.setCat("Turlututu");
piece.setExpo("Tarlatata");
piece.setPeutpret("Oui");
piece.setDate("2006/11/17");

piece.setIdentifiant();

cout << "Pour voir : " << endl;
cout << piece.getIdentifiantCategorie() << endl;
cout << piece.getIdentifiantDatein() << endl;
cout << piece.getIdentifiantCpt() << endl;

char c;
cin >> c;
}

Mais, ton code actuel n'est pas assez abouti. Tu as une fonction membre pour la saisie. Ton identifiant est fonction de ce qui est saisie, ce qui (m'a) oblige a déclarer l'identifiant par un pointeur, vu que celui ci ne peut pas etre créer à la création de l'objet. Tu devrais faire une fonction statique de saisie de tes pieces, qui te renverrais un objet correctement construit (plutot que de construire un objet "vide", que tu remplis en appelant une de ses fonctions membres).

Pour ce qui est de mettre la classe Identifiant dans la classe PieceMusee, c'est ce qui m'a semblé le plus logique, ta classe Identifiant comme tu en as parlé est très lié a ta classe PieceMusée, et n'a pas vraiment de sens si elle en est sorti.

Ce code n'est pas beau, je sais. :)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ce bout de code, qui me montre pas mal de possibilités avec le C++. Cependant, je n'ai pas le droit d'intégrer la classe "Identifiant" dans "PieceMusee". L'aggrégation est obligatoire, mais je pense maintenant l'avoir faite.

Je dois cependant encore corriger quelques bugs.

Pour le moment, je définis l'identifiant à la fin de la saisie de la pièce:

PieceMusee::saisie()
{
...
id=num.toString();
setPiece(categorie,expose,peutpret,valeur,datein,id);
cout<<"\nEncodage de la piece termine."<<endl;
getchar();
}

string Identifiant::toString()
{
string ide;
char tmp[80];

ide=(getCategorie().substr(0,3));
ide=ide+(getDatein().substr(6,4));
setCpt();
itoa(getCpt(),tmp,10);
ide=ide+tmp;
return ide;
}

Un grand merci en tout cas :love:

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ce bout de code, qui me montre pas mal de possibilités avec le C++. Cependant, je n'ai pas le droit d'intégrer la classe "Identifiant" dans "PieceMusee". L'aggrégation est obligatoire, mais je pense maintenant l'avoir faite.

Je dois cependant encore corriger quelques bugs.

Pour le moment, je définis l'identifiant à la fin de la saisie de la pièce:

PieceMusee::saisie()
{
...
id=num.toString();
setPiece(categorie,expose,peutpret,valeur,datein,id);
cout<<"\nEncodage de la piece termine."<<endl;
getchar();
}

string Identifiant::toString()
{
string ide;
char tmp[80];

ide=(getCategorie().substr(0,3));
ide=ide+(getDatein().substr(6,4));
setCpt();
itoa(getCpt(),tmp,10);
ide=ide+tmp;
return ide;
}

Un grand merci en tout cas :chinois:

Non, ton agregation n'est pas faite, pour une raison toute simple. Lorsque tu construis ton objet PieceMusee, il n'y a aucun objet Identifiant qui est agrégé à celui ci :)

Tu es sur que tu ne peux pas mettre la classe Identifiant dans PieceMusee ? Car cela ne change rien au niveau agregation, duree de vie. Cela change juste la visibilité de la classe (qui est privé, et n'est visible que pour PieceMusee). Et ca fait plus mieux pro :byebye:

Donc, je me repete, change (vire :yes:) ta fonction de saisie, et fais en une en statique (pourquoi statique ? Car cela signifie qu'elle n'a pas besoin d'une instance de ta classe pour etre appellé), ou alors fais une fonction en dehors de tes classes qui demande la saisie a l'utilisateur, et apres construit ton objet PieceMusee. :transpi:

Ex:

class PieceMusee {
static const PieceMusee * saisie() {

	string categorie, datein, expo;

	cin >> categorie;
	cin >> datein;
	cin >> expo;

	return new PieceMusee(categorie, datein, expo);

}
}

int main() {

PieceMusee * maPiece = PieceMusee::saisie();

}


class PieceMusee {

}

const PieceMusee * saisie() {
string categorie, datein, expo;

cin >> categorie;
cin >> datein;
cin >> expo;

return new PieceMusee(categorie, datein, expo);

}


int main() {

PieceMusee * maPiece = saisie();

}

Il est primordial pour ton aggregation que, lorsque ton objet est créé, il le soit complétement (donc avec les valeur saisi), pour que l'identifiant puisse lui aussi etre imédiatement créé. Enfin, c'est ce que j'ai tjs appris :x

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...