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 :

Problème de constructeur ?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut Problème de constructeur ?
    Bonjour à tous.

    Ben voilà, je vais essayer de faire au plus court.
    J'ai une classe appelée "Armoire", une classe appelée "Vecteur" et une dernière appelée "piecemuseeart".

    Dans mon énoncé on me dit:

    • créer une classe vecteur template, encapsulant un tableau dynamique
    • tester la classe avec des int tout d'abord; et ensuite avec des objets piecemuseeart
    • intégrer un tel vecteur dans une class armoire


    Pour ce faire, j'ai procéder comme suit:

    - tout d'abord, j'ai créé la classe vecteur, avec un système pour gérer les places vides:
    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
     
    template <class T> class Vecteur
    {
    private:
    	T *Data;
    	int nbrElem;
    	int *Index;
    public:
    	// constructeur
    	// d'initialisation
    	Vecteur(int n = 20 );
     
    	// destructeur
    	~Vecteur(void)
    	{
    		delete[] Data;
    	}
     
    	// methodes d'acces au variables et de construction d'index
    	T& operator[](int i){ return *(Data+i);};
    	int placelibre();
    	void setindex(int N, int NV){	Index[N] = NV; }
    	int getindex(int N){	return Index[N];	}
     
    };
    - Ensuite, j'ai tenté d'insérer cette classe vecteur dans une classe "Armoire":

    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
     
    #include<string.h>
    #include<stdlib.h>
     
    #include"./piecemusee/piecemusee.h"
    #include"./Vecteur.h"
     
    class Armoire
    {
    private:
    	int nbr;
    	Vecteur <piecemusee> *Vpm;
    public:
    	// constructeur
    	Armoire()
    	{
    		nbr = 0;
    		Vpm = NULL;
    	}
     
    	// d'initialisation
    	Armoire(int i);
     
    	// destructeur
    	~Armoire(void);
     
    	// methodes d'acces au Vecteur
    	void setvalue(piecemusee& PM);
    	void affiche();
    };
    - pour finir, j'ai essayé d'instancier cette dernière classe "Armoire" dans le main de mon application de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Armoire Arm;
    Arm = new Armoire();
    Et voilà ce qui se passe lors de la compilation de mon application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    creation de main.o
    main.cxx: In function ‘int main()’:
    main.cxx:65: error: invalid conversion from ‘Armoire*’ to ‘int’
    main.cxx:65: error:   initializing argument 1 of ‘Armoire::Armoire(int)’
    make: *** [Main] Erreur 1
    La ligne 65 est la ligne ou je fait appel a mon constructeur par défaut. J'ai également essayer de lui passer en paramètre lors de l'appel du constructeur, une valeur qui serait donc la taille du vecteur à créer, mais rien ne change, le message d'erreur reste le même.

    Quelqu'un pourrait-il me dire d'où viendrait mon erreur? Ce serait super , parce que là, je ne vois absolument pas, et ça fait quelques jours que je suis dessus ( 3 je crois).
    Si jamais l'erreur est une bétises incroyable, je pense bien que je ne saurais plus ou me mettre

    Quoiqu'il en soit, je vous remercie d'avance pour l'aide que vous pourrez m'apporter et vous souhaites une bonne fin de journée.

    Richard_Sraing

    p.s.: pour ceux qui auront eux le courage de lire ce message jusqu'au bout, je tiens à préciser que la classe piecemusee est la classe mère de la classe piecemuseeart.

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    plusieurs remarques:
    1/ Pourquoi réinventer la roue? La STL possède une classe vector, et même si tu es le meilleur développeur du monde, tu ne feras pas mieux.
    2/ L'en-têtes <string.h> est déprécié. Il faut utiliser <string> (pas de .h)
    3/ Tes erreurs sont dans le main. Il faudrait donc que tu nous montre le code du main pour que l'on puisse t'aider.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    1/ Pourquoi réinventer la roue? La STL possède une classe vector, et même si tu es le meilleur développeur du monde, tu ne feras pas mieux.
    Euh si, on peut faire bien mieux.

  4. #4
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut
    Je ne tente pas de réinventer la roue, je tiens simplement à respecter l'énoncé fournit par notre prof. Je sais que c'est un peu stupide de procéder de la sorte, mais bon, l'école c'est l'école, dans le cadre professionel, il est claire que j'aurais procéder différement.

    Pour le main, le voici, j'ai retirer tout ce qui n'as pas d'importance dans notre cas:

    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
    int main()
    {
    FichierLog fl;
     
    fl<<"Entree dans l'applic";
    fl<<"Initialisation des variables";
    int 	rc, rcc;
    piecemusee* pm;
    piecemuseeart* pma;
    Armoire Arm;
     
    pm = new piecemusee();
    pma = new piecemuseeart();
    Arm = new Armoire();
     
    do{
    	fl<<"Entree dans le menu principal";
    	Clear();
    	rc = 0;
    	rc = MainMenu();
    	switch(rc)
    	{
    		case 1: // affiche le menu des piece simple
    			do{
    				fl<<"Entree dans le menu des pieces";
    				Clear();
    				rcc = 0;
    				rcc = PMMenu();
    				switch(rcc)
    				{
    					case 1:	// ajout d'une piece de musee
    						Clear();
    						fl<<"Ajout d'une piece de musee";
    						pm->insert();
    						Arm.setvalue(*pm);
    						fl<<"Ajout effectue";
    						break;
     
    					case 2:	// affichage de la piece de musee
    						fl<<"Affichage de la piece saisie";
    						Clear();
    						Arm.affiche();
    						fflush(stdin);
    						Pause();
    						break;
     
    					case 3:	// changement de la valeur de la piece
    						fl<<"Changement de la valeur de la piece";
    						Clear();
    						pm->setNewvaleur();
    						fl<<"Valeur changée avec succès";
    						break;
     
    					case 4:	// quitte le menu
    						fl<<"Quitte le menu piece musee";
    				};
    			}while(rcc != 4 );
    			rcc = 0;
    			break;
    		case 2: // Affiche le menu des pieces d'art
    			do{
    				fl<<"Entree dans le menu de piece d'art";
    				Clear();
    				rcc = 0;
    				rcc = PMAMenu();
    				switch(rcc)
    				{
    					case 1: // ajout d'une piece d'art
    						Clear();
    						fl<<"Ajout d'une piece d'art";
    						pma->insert();
    						Arm.setvalue(*pma);
    						fl<<"Ajoutee avec succes";
    						break;
    					case 2: // affichage de la piece d'art
    						fl<<"Affichage de la piece d'art";
    						Clear();
    						Arm.affiche();
    						fflush(stdin);
    						Pause();
    						break;
    					case 3: // changement de la valeur de la piece d'art
    						fl<<"Changement de la valeur de la piece";
    						Clear();
    						pm->setNewvaleur();
    						fl<<"Valeur changée avec succès";
    						break;
     
    					case 4:	// quitte le menu
    						fl<<"Quitte le menu piece musee";
     
    				};
    			}while(rcc != 4);
    			rcc = 0;
    			break;
    Voilà, le reste du code est inutile dans notre cas. Tout ce qui concerne la fameuse classe Armoire et le Vecteur se situent la dedans.

    Merci à vous de prendre le temps de vous occuper de mon cas

    Richard_sraing

    P.S.: la variable fl est une classe que j'ai écrite afin de pouvoir créer un fichier de LOG qui trace toute les étapes de mon application par lesquels je passe, pour dans le cas d'un plantage, je puisse remettre en place les mêmes valeurs et donc recréer le même environnement pour les tests que le plantage précédent.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Armoire Arm;
    Arm = new Armoire();
    Il faut déclarer Arm en tant qu'Armoire* (ou l'allouer sur la pile).
    En plus je vois que tu as un pointeur sur ta classe Vecteur en donnée membre, ça sert à quoi vu que son but est justement d'encapsuler les manipulations de pointeurs ?

    La STL possède une classe vector, et même si tu es le meilleur développeur du monde, tu ne feras pas mieux.
    Faut pas être extrémiste, dans des contextes particuliers on peut développer des versions plus adaptées à nos besoins

    2/ L'en-têtes <string.h> est déprécié. Il faut utiliser <string> (pas de .h)
    (le mot "déprécié" est un faux ami, dans ce contexte on dit plutôt "obsolète")
    En fait il n'est pas obsolète, les deux versions sont valides. La version en .h peut parfois même être préférable, car certains compilos n'implémentent pas correctement la version sans .h (au niveau des namespaces).

  6. #6
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut
    Je le savais que ça ne pouvais être qu'une erreur aussi que ça. Mais je ne l'ai pas trouvée.

    Quoiqu'il en soit merci à vous tous pour votre coup de clavier.

    Maintenant j'ai une erreur de segmentation, mais je pense bien pouvoir résoudre celle-ci tout seul.

    Encore merci à vous, et bonne fin de journée.

    Richard_sraing

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

Discussions similaires

  1. problème de constructeur avec wxWidget
    Par Ardeciel dans le forum wxWidgets
    Réponses: 2
    Dernier message: 10/03/2007, 23h11
  2. Problème définition constructeur
    Par bugland dans le forum Langage
    Réponses: 11
    Dernier message: 12/02/2007, 14h34
  3. Problème de constructeur de copie ?
    Par Bestiol dans le forum C++
    Réponses: 6
    Dernier message: 03/11/2006, 11h28
  4. [POO]Probléme de constructeur virtuel surchargé
    Par Laurent Dardenne dans le forum Delphi
    Réponses: 10
    Dernier message: 15/08/2006, 12h19
  5. [C#] DLL, problème de constructeur
    Par gmonta dans le forum C#
    Réponses: 4
    Dernier message: 30/11/2005, 09h43

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