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 :

[Débutant]Constructeur et new/delete


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut [Débutant]Constructeur et new/delete
    Bonjour tout le monde !

    Je cale sur un problème très gênant et pourtant les constructeurs, les classes et les allocations sont les prémisses à la programmation en C++.

    Contenu de mon fichier Dossier1.h
    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
    #ifndef _MESSAGE
    #define _MESSAGE
    class message
    {
    	private:
    		enum { n = 10 };
    		static int cpt_id_message; // compteur nombr id déjà utilisé
    		int num_id_message;	// num id du message
    		char *adresse_expediteur;
    		char *adresse_destinataire;
    		bool urgent;
    		bool mess_lu;
    		char *sujet;
    		char *texte;
    		char *tmpCheckFormat;	// variable temporaire qui vérifiera la présence du " @ "
    	public:
    		message (void);					// constructeur par défaut
    		message (int num, char *ad_exp, char *ad_dest, bool urg, bool msg_lu, char *sjt, char *txt, char *tmpCF);
    		~message (void)	// Destructeur class message
    		{
    			cout << "Appels des destructeurs" << endl;
    			delete adresse_expediteur;
    			delete adresse_destinataire;
    			delete sujet;
    			delete texte;
    			delete tmpCheckFormat;
    			fflush(stdin); getchar();
    		}
    		void affMessage (void);	// afficher le message
    		void encMessage (void);	// entrer le message
    		void checkFormatMsg (void);	// vérifie la présence d'un " @ "
    };
    #endif
    Le contenu de mon fichier Dossier1.c :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    #include <string>	// => strcpy
    #include "Dossier1.h"
     
    void EffEcran(void);
    void Pause(void);
    int message::cpt_id_message = 0;
     
    message::message (void)
    {
    	num_id_message = 0;
    	adresse_expediteur = NULL;
    	adresse_destinataire = NULL;
    	urgent = false;
    	mess_lu = false;
    	sujet = NULL;
    	texte = NULL;
    	tmpCheckFormat = NULL;
    }
     
    message::message(int num, char *ad_exp, char *ad_dest, bool urg, bool msg_lu, char *sjt, char *txt, char *tmpCF)
    {
    	int i=0;
    	num_id_message = num;
     
    	adresse_expediteur =  new char [strlen(ad_exp)+1];
    	strcpy(adresse_expediteur,ad_exp);
    	adresse_destinataire = new char [strlen(ad_dest)+1];
    	strcpy(adresse_destinataire,ad_dest);
    	urgent = urg;
    	mess_lu = msg_lu;
    	sujet= new char [strlen(sjt)+1];
    	strcpy(sujet,sjt);
    	texte = new char [strlen(txt)+1];
    	strcpy(texte,txt);
    	tmpCheckFormat = new char [strlen(tmpCF)+1];
    	strcpy(tmpCheckFormat,tmpCF);
    }
     
    void message::affMessage (void)
    {
    	int i=0;
    	EffEcran();
    	cout << "||================================================||" << endl;
    	cout << "||----------	Affiche un message		----------||" << endl;
    	cout << "||================================================||" << endl;
    	cout << "||* ID Message : " << num_id_message << endl;
    	cout << "||* Expediteur : " << adresse_expediteur << endl;
    	cout << "||* Destinataire : " << adresse_destinataire << endl;
    	cout << "||* Urgent : " << urgent << endl;
    	cout << "||* Lu : " << mess_lu << endl;
    	cout << "||* Sujet : " << sujet << endl;
    	cout << "||* Texte : " << texte << endl;
    	cout << "||================================================||" << endl;
    }
     
    void message::encMessage (void)
    {
    	EffEcran();
    	int rep, i=0;
    	char choix1,choix2;
    	num_id_message=++cpt_id_message;
    	cout << "||================================================||" << endl;
    	cout << "||----------	Ecrire un message	----------||" << endl;
    	cout << "||================================================||" << endl;
    	cout << "||* Entrer l adresse expediteur : ";
    		fflush(stdin); cin >> tmpCheckFormat;
    		checkFormatMsg(); strcpy(adresse_expediteur,tmpCheckFormat);
    	cout << "||* Entrer l adresse destinataire : ";
    		fflush(stdin); cin >> tmpCheckFormat;
    		checkFormatMsg(); strcpy(adresse_destinataire,tmpCheckFormat);
    	cout << "||* Urgent : (1/0)";
    		cin >> rep;	urgent=(rep == 1)?true:false;
    	cout << "|| Souhaitez-vous utiliser un message de type predefini ? (O/N)" << endl;
    	cout << "||=> "; cin >> choix1;
    	switch(choix1)
    	{
    		case 'O' :	cout << "|| Souhaitez-vous envoyer un message d'(A)bsence ou de (F)elicitation ?"; cin >> choix2;
    			switch(choix2)
    			{
    			case 'A' :
    				strcpy(texte,"Je serai absent car : ");
    				strcpy(sujet,"ABSENCE pendant ");
    					/* Définition du TEXTE */
    				cout << "||* Quelle en est la raison ?\n||=> "; fflush(stdin); cin.getline(tmpCheckFormat,1000);
    					strcat(texte,tmpCheckFormat);	// Réutilisation de la variable tmpCheckFormat comme variable temporaire pour la concaténation
    					strcat(texte," pour une duree de : ");
    				cout << "||* Pendant combien de temps ?\n||=> "; fflush(stdin); cin.getline(tmpCheckFormat,1000);
    					strcat(texte,tmpCheckFormat);
    					strcat(sujet,tmpCheckFormat);
    				break;
    			case 'F' :
    				strcpy(texte,"Sincere felicitation pour : ");
    				strcpy(sujet,"OCCASION pour ");
    					/* Définition du TEXTE */
    				cout << "|| Quelle est l'occasion ?\n||=> "; fflush(stdin); cin.getline(tmpCheckFormat,1000);
    					strcat(texte,tmpCheckFormat);
    					strcat(sujet,tmpCheckFormat);
    					cout << "|| Formule de politesse :\n||=> "; fflush(stdin); cin.getline(tmpCheckFormat,1000);
    					strcat(texte,tmpCheckFormat);
    				break;
    			}
    			break;
    		case 'N' :	cout << "||* Sujet (max 100) : ";
    						fflush(stdin); cin.getline(sujet,100);
    					cout << "||* Texte (max 1000) : ";
    						fflush(stdin); cin.getline(texte,1000);
    				break;
    	}
    	cout << "||================================================||" << endl;
    }
     
    void message::checkFormatMsg (void)
    {
    	int verif = 0;
    	char *result_cmp, arobat='@';
    	result_cmp = strchr(tmpCheckFormat,arobat);
     
    	while(result_cmp == NULL)
    	{
    		cout << "\n|| !!! L'adresse doit comporter un @ ! Recommencez !\n||=> ";
    		cin >> tmpCheckFormat;
    		result_cmp=strchr(tmpCheckFormat,arobat);
    	}
    }
    void EffEcran(void)
    {
    #ifdef _WIN32
    system("CLS");
    #else
    printf("\033[2J");
    #endif
    }
    Et enfin le contenu de mon fichier test.cpp, qui permet juste de lancer deux fonctions d'appels et rien d'autres...
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    #include "Dossier1.h"
    void EffEcran(void);
    void main (void)
    {
    	message monMessage (123,"Vide","Vide",false,false,"Vide","Vide","Vide");
    	char rep;
    	do{
    		EffEcran();
    		cout << "||================================================||" << endl;
    		cout << "||----------	Inpres Local Mail	----------||" << endl;
    		cout << "||================================================||" << endl;
    		cout << "||  Souhaitez-vous : \n||- (E)crire un message\n||- (R)ecevoir un message\n||- (Q)uitter\n||" << endl;
    		cout << "||=> "; cin >> rep;
    		switch (rep)
    		{
    			case 'E' : fflush(stdout); monMessage.encMessage(); fflush(stdin); getchar();
    				break;
    			case 'R' : fflush(stdout); monMessage.affMessage(); fflush(stdin); getchar();
    				break;
    		}
    	}while (rep!='Q');
    }
    Et le problème se situe plus que probablement à cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message monMessage (123,"Vide","Vide",false,false,"Vide","Vide","Vide");
    Le problème est que lorsque "j'envois un message", je dois donc encoder des adresses e-mail, suje, texte etc (quand je demande souhaitez vous prendre un message prédéfini, répondez "N" (en maj))... Seulement, lorsque je quitte mon programme, j'ai windows qui m'affiche une belle erreur et celà provient lors de l'appel du destructeur. En effet, il plante après l'affichage de "Appels des destructeurs". En faite, lorsque je dépasse 4 caractères çà plante, moins de 4 caractères pas de prob, ce pourquoi le problème se trouve peut-être là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message monMessage (123,"Vide","Vide",false,false,"Vide","Vide","Vide");
    Vu que Vide, fait bien 4 caractères... ou alors mon constructeur d'initialisation est pas correcte...

    Je voudrais ne pas dépendre d'une taille et le code est ouvert à toutes modifications bien évidemment.

    Je vous remercie d'avance de l'attention que vous m'apporterez... Dur dur le C++

  2. #2
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Salut !!

    C'est pas delete, mais delete [] qu'il faut utiliser, car tu fais un new [] et non un new...

    Ce sont des opérateurs différents : http://c.developpez.com/faq/cpp/?pag...S_delete_array

    Sinon je te conseille de carrément laisser tomber tout ça popur utiliser la classe string de la STL (un #include <string> suffit)... Elle est beaucoup plus pratique, et ça évite ce genre de problèmes...
    En plus les char, c'est caca : http://c.developpez.com/faq/cpp/?pag...INGS_avantages

    A+

  3. #3
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Je suis 100% d'accord sur l'usage des std::string !

    En plus les char, c'est caca
    J'adore !!!!

  4. #4
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par Rupella
    Je suis 100% d'accord sur l'usage des std::string !

    En plus les char, c'est caca
    J'adore !!!!
    +1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    evite les #include <*.h> de plus utilie soit iostream soit stdio.h.

    Ciao!
    Ben

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Merci les gars

    Mais pour le delete [] çà marche malheureusement pas... J'ai toujours le message : "This may ne due to a corruption of the heap, and indicates a bug in Dossier.exe or any of the DLLs it has loaded.

    Mais je vais bosser sur votre proposition avec les strings (en attendant la réponse de la prof) çà corrigera peut-être mon prob...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Points : 82
    Points
    82
    Par défaut Re: [Débutant]Constructeur et new/delete
    Citation Envoyé par Geolem
    Bonjour tout le monde !
    Je cale sur un problème très gênant et pourtant les constructeurs, les classes et les allocations sont les prémisses à la programmation en C++.
    Absolument ... mais les string's et les flux (mathieu_t dirait que fflush(stdin), c'est caca ) aussi ... puis en plus c'est beaucoup plus simple que les char***********

    Bonne chance
    Kwakanar

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

Discussions similaires

  1. [Débutant] Constructeur par recopie pour TComponent
    Par Runlevel dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/05/2006, 16h58
  2. [débutant] constructeur
    Par alex'l dans le forum C++
    Réponses: 2
    Dernier message: 11/04/2006, 13h44
  3. [Débutant] Constructeur d'une classe
    Par chennuo dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 22h17
  4. [JUnit] [Test][Débutant] Constructeur privé
    Par Shabata dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 12/01/2006, 15h45
  5. Namespace et surcharge operator new/delete
    Par ZeLegolas dans le forum C++
    Réponses: 11
    Dernier message: 26/07/2005, 13h55

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