Besoin d'eclaircissement sur les classes et pointeurs

oliarn Messages postés 7 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 14 septembre 2004 - 14 nov. 2003 à 15:57
oliarn Messages postés 7 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 14 septembre 2004 - 16 nov. 2003 à 12:09
bonjour,

je fais un programme en c++ pour la fac e tj'aimerai savoir comment manipuler mes classes dans mon programmes.

voila une fonction par exemple message esst une classe qui contient un pointeur vers un message suivant pour chainee les messages. cette fonction doit permettre de lire le ieme message de cette liste .

int utilisateur :: lire(int numero, message* liste)
{
ptrmsg tmp;
int indice=1;
tmp = new message;

tmp=liste;

while(indice!=numero)
{
/* Gestion des errreurs, ex: le message que l'on souhaite effacer n'existe pas */
if (tmp==NULL)
{

return 0;
else {
/*on avance au prochain message et on incremente l'indice*/
tmp=tmp->suivant;
indice++;
}

}

cout<<"expediteur:" ;
cout<<tmp.expediteur<<endl;
cout<<"sujet: ";
cout<<tmp.sujet<<endl;
cout<<"date: ";
cout<<tmp.date<<endl;
cout<<"texte: ";
cout<<tmp.texte<<endl;

return 1;

}

5 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
14 nov. 2003 à 16:08
l'objet message créé est inutile. De plus, comme tu réaffecte une nouvelle valeur à tmp juste après, l'adresse de l'objet créé est perdue et donc du ne pourras pas l'utiliser ni détruir l'objet.
tmp = new message;
tmp=liste;

ensuite, pour accéder aux champs de tmp, il faut utiliser -> (comme tu le fais dans le while) au niveau des cout
cout<<"expediteur:" ;
cout<<tmp->expediteur<<endl;
cout<<"sujet: ";
cout<<tmp->sujet<<endl;
cout<<"date: ";
cout<<tmp->date<<endl;
cout<<"texte: ";
cout<<tmp->texte<<endl;
0
oliarn Messages postés 7 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 14 septembre 2004
14 nov. 2003 à 16:11
donc le new et le delete ne serve a rien ?

en fait quand j'a iun pointeur de classe pour acceder a la valeur de ses arguments il faut que je fasse nom->argument ? je pensais que ca em renvoyais le pointeur vers l'argument.

autrement si je dis que tmp es tun message ca ne marcherait pas ?
0
oliarn Messages postés 7 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 14 septembre 2004
14 nov. 2003 à 16:19
je sais pas si t uauras le courage de lire ce code mais est ce que les pointeurs sont bien utilises et est ce la facon la plus simple de proceder ?

ptrutil charger_utilisateur(const char* fichier) { // fonction qui va nous servir a instancier
// une classe utilisateur a partir d'un fichier.
ptrutil util;
string mot;
ptrmsg tmp;

ifstream Entree("fichier") // on ouvre le fichier grace a un flux .

tmp=util->anc_mess; // on pointe tmp sur le debut
// de la liste des anciens messages.
Entree>>mot;

if ((mot!="$"))

{
cout << "fichier non valide (utilisateur)" << endl;

return NULL;
exit(0);
}
Entree>>mot;
util->pass=mot;
Entree>>mot;
util->num_ip=mot;
Entree>>mot;

if (mot!="$")
{
cout << "fichier non valide (utilisateur)" << endl; //procedure d'erreur de fichier
Entree.close();
return NULL;

}
else
{



While (mot !="?") //tant que l'on ne rencontre pas se fichier on charge les anciens messages

{
Entree>>mot;
tmp->expediteur=mot; //chargement caracteristique message
Entree>>mot;
tmp->destinataire;
Entree>>mot;
tmp->lu=mot;
Entree>>mot;
tmp->sujet=mot;
Entree>>mot;
tmp->date=mot;

while(mot!="#")
{

Entree>>mot; // chargement du texte tant que l'on ne tombe
tmp->text=tmp.text+mot; // pas sur le signe de fin de message
}

tmp=tmp->suivant; // on passe au chargement du prochain message
// si on est pas arrive a la fin de la liste
// des anciens messages.
}

tmp=util->nouv_mess; // on va maintenant charger les nouveaux messages

while (Entree>>mot) // tant que l'on rencontre des caracteres
// c qu'il reste des nouveaux messages a charger
{
Entree>>mot;


tmp.expediteur=mot;
Entree>>mot;
tmp->destinataire; // meme procedure que pour les anciens messages.
Entree>>mot;
tmp->lu=mot;
Entree>>mot;
tmp->sujet=mot;
Entree>>mot;
tmp->date=mot;

while(mot!="#")
{

Entree>>mot;
tmp->text=tmp->text+mot;
}
tmp=tmp->suivant;
}
}
}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
14 nov. 2003 à 23:29
Pour savoir si les pointeurs sont bien utilisés (syntaxiquement parlant) tu compile et tu regarde le résultat.
Si tmp est un poiteur sur un objet de type message et que tufait tmp.txt, tua auras une erreur de compilation.

Sinon, quant tu déclare un pointeur sur un objet, avant de l'utiliser, il FAUT l'initialiser. Pour cela 2 façon :
- A partir d'un objet déjà existant (début de liste par exemple)
- En créant un nouvel objet dynamiquement avec new.

C'est pour ca que dans le premier exemple le new est inutile car tu initialise tmp avec le début de la liste

Dans le deuxième exemple, le pointeur "util" est utilisé avant d'être initialisé.

Enfin, pour comparer des chaînes de caractères, c'est pas
if(mot != "$") mais if(strcmp(mot, "$") != 0)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
oliarn Messages postés 7 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 14 septembre 2004
16 nov. 2003 à 12:09
Merci, j'ai fait les modifs et c plus klr dans ma tete maintenant.
0
Rejoignez-nous