Surchage d'opérateurs cin avec struct C++

Résolu/Fermé
Maxianos Messages postés 55 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 2 juin 2009 - 25 nov. 2008 à 20:18
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 26 nov. 2008 à 08:54
Bonjour,
je dois implémenter une boîte de messagerie avec des emails...

Tout d'abord, dans le main, on demande l'opération que l'on veut faire : ajouter un message, lire un message, afficher la liste des messages, retirer un message...
De plus, lorsque qu'on ajoute un message, on doit demander à l'utilisateur d'entrer toute les informations du message comme la source, le destinataire, le sujet, la date d'envoi, et le contenu.. De même, la date doit elle aussi être défini en jour / mois / année - heure - minute...
Ainsi, j'ai créé trois nouveaux, le type message qui contient mes informations de message (source, contenu, date..) puis un type date pour détaillé la date en jour mois année...
J'ai aussi créé un type boite où j'ai un compteur et une liste de message sous forme de tableaux...
struct type_date // type_date est un type permettant l'affichage de la date dans un message

{
	int jour;
	int mois;
	int annee;
	int heure;
	int minute;
};

struct type_message // type_message contient les paramètres d'un message
{
	string source;		// De qui le message vient
	string destination;	                // À qui il est destiné
	type_date date;		// Date et heure d'envoi du message
	string sujet;		// Titre du message
	string contenu;		// C'est le texte contenu dans le message
};

struct type_boite // type_boite contient une liste des message avec un compteur pour déterminer l'emplacement d'un message
{
	int cpt;
	type_message liste[26];
};

Et voici le main :

void main ()
{
	type_boite maboite;
	maboite.cpt = 0;
	string action;

	do
	{
		cout << "Que voulez-vous faire? ajouter, afficher, retirer, lire, fin" << endl;
		cin >> action;

		if (action == "ajouter"){
			ajouter(maboite);
		}

		else if (action == "afficher"){
			afficher(maboite);
		}

		else if (action == "retirer"){
			retirer();
		}

		else if (action == "lire"){
			lire(maboite);
		}

		else if (action == "fin"){
			return;
		}

		else
			cout << "Impossible d'exécuter cette commande" << endl;
	}

	while (action != "fin");

	return;
}


Bon, prenons comme exemple que l'utilisateur décide d'ajouter un message... Il entre "ajouter" ce qui nous amène dans la fonction ajouter() :

void ajouter(type_boite& maboite)
{
	//cryptage(int, type_boite maboite);
	struct type_message source, destination, date, sujet, contenu;
	struct type_date jour, mois, annee, heure, minute;
	int crypt;
	struct type_boite cpt;

	cout << "Entrez les paramètres du message" << endl;
	cout << "La source" << endl;
	cin >> maboite.liste[cpt].source;

	cout << "Le destinataire" << endl;
	cin >> maboite.liste[cpt].destination;


	cout << "La date d'envoi" << endl;
	cout << "Le jour" << endl;
	cin >> maboite.liste[cpt].date.jour;

	cout << "Le mois" << endl;
	cin >> maboite.liste[cpt].date.mois;

	cout << "L'annee" << endl;
	cin >> maboite.liste[cpt].date.annee;

	cout << "L'heure en heures" << endl;
	cin >> maboite.liste[cpt].date.heure;

	cout << "L'heure en minutes" << endl;
	cin >> maboite.liste[cpt].date.minute;


	cout << "Le titre du message" << endl;
	cin >> maboite.liste[cpt].sujet;

	cout << "Le contenu du message" << endl;
	cin >> maboite.liste[cpt].contenu;


	cout << "Entrez la clé de cryptage" << endl;
	cin >> crypt;

	cryptage(crypt, maboite.liste[cpt].contenu); // Cryptage du message avec le module cryptage

	maboite.cpt++;

}

Mon problème est comment surcharger l'opérateur >> sur cin pour pouvoir enregistrer mes informations dans le type message...
Je sais qu'il faut une définition du cin >> dans la définition de struct plus haut, mais comment faut-il faire ??


Merci, je sais.. J'ai donné peut-etre un peu trop d'info... LOL

2 réponses

Utilisateur anonyme
26 nov. 2008 à 03:13
Bonjour,

Je ne puis répondre eaxtement à votre question, mais je puis vous donner une piste !.
À l'époque, on m'a apprit qu'il falait utilisé une fonction amie.

Voici comment j'ai surchargé l'opérateur [ cout << ]

ostream &operator<< (ostream &flux, const boites &s)
{
  int j=0,k=0;

  flux << "\n\n\n     {";
//mib

  cout << endl;
  while ( k < tailleMax )
	{
		cout << "     ";
		while ( j < ( tailleMax / 10 ) )		// Description de la ligne
		{
			if ( s.boites[k] < 10 )
			{
				if ( s.boites[k] == 1 ) flux << " " << k << " ";
			    else flux << "  ";
//			    flux << s.boites[k] << " " ; // Ligne de déboggage
				j++;
				k++;
			}
			else
			{
				if ( s.boite[k] == 1 ) flux << k << " ";
			    else flux << "  ";
//			    flux << s.boite[k] << " " ; // Ligne de déboggage
				j++;
				k++;
			}
		};
		j = 0;								// Ligne suivante
		cout << endl;
	};
	flux << "     }\n\n\n";

//mib
  return flux;
};


il faut trouver le bon nom de la fonction amie, iostream probablement
et à l"intérieur d'une telle fonction, tu remplie toute ta structure
morceau par morceau.


ainsi tu peux pousser ton objet sur un cin et il voit ta structure "

Dans mon exemple je pousse un tableau de 100 éléments sur le cout.

Lupin
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
26 nov. 2008 à 08:54
pour surchargé l'opérateur, c'est simple (assez similaire à ce que dit lupin) :
std::istream& operator(std::istream is,const boite& b)
{
         is>>b.cpt;
         for(int i=0;i<26;i++)
         {
             is>>b.liste[i].source;
             is>>b.liste[i].destination;
             ...
         }
         return is;
}
ensuite, tu fait simplement std::cin>>boite_t; et c'est bon.
Par contre, les fonctions amies (friend) c'est utile lorsque tu souhaite accédé à des membres privés de classe, là tu utilise des structures, donc tout est publique par défaut.
0