[C++] Classe template vecteur.

Résolu/Fermé
Coranys Messages postés 5 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 16 décembre 2007 - 14 déc. 2007 à 23:44
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 - 20 déc. 2007 à 12:22
Bonsoir,

Quelqu'un pourrait-il m'éclairer sur la façon de programmer un Vecteur Template?
De ce que j'en sais, on peut créer en C++ des vecteurs dont la nature des éléments peut être définie de manière dynamique.

Pour l'heure, j'ai tenté de faire en glânant des informations ci et là mais je n'y arrive vraiment pas :(

Voici ce que j'ai fait (si quelqu'un aurait la bonté de me dire ce qui cloche) :

/*Fichier "Vecteur.h*/

#ifndef _VECTEUR
#define _VECTEUR

template <class T> class Vecteur
{
private :
T *data;
int NbElem;

public :

/*Constructeur par défaut*/
Vecteur ();

/*Constructeur d'initialisation*/
Vecteur (const int INIT_NbElem);

/*Destructeur*/
~Vecteur ();

/*Methodes "getXXX ()"*/
T* getElement () const;

/*Methodes "setXXX ()"*/
void setElement (const int Set_Indice, const T* Set_Element);

/*Méthode d'affichage*/
void affiche ();
};

#endif


/*Fichier "Vecteur.cxx*/

#include "Vecteur.h"
#include <string>
#include <iostream.h>

#include <stdlib.h>

/*using namespace std;*/ /*Permet d'utiliser les cout avec une syntaxe moins lourde*/


/**************************************/
/*DECLARATIONS DES METHODES "getXXX()"*/
/**************************************/

*T Vecteur<class T>::getElement () const
{
return data;
}


/**************************************/
/*DECLARATIONS DES METHODES "setXXX()"*/
/**************************************/

void Vecteur<class T>::setElement (const int Set_Indice, const T Set_Element)
{
data[Set_Indice] = Set_Element;
}


/*************************/
/*CONSTRUCTEUR PAR DEFAUT*/
/*************************/

Vecteur<class T>::Vecteur ()
{
cout << "Nous utilisons le constructeur PAR DEFAUT de Vecteur." << endl;
data = new type[10];
NbElem = 10;
}


/*******************************/
/*CONSTRUCTEUR D'INITIALISATION*/
/*******************************/

Vecteur<class T>::Vecteur(const int INIT_NbElem)
{
cout << "Nous utilisons le constructeur d'INITIALISATION de Vecteur." << endl;
data = new type[INIT_NbElem];
NbElem = INIT_NbElem;
}


/*************/
/*DESTRUCTEUR*/
/*************/

Vecteur<class T>::~Vecteur ()
{
cout << "Destructeur de Vecteur en cours..." << endl;

if (data)
{
delete data;
}

cout << "Destructeur de Vecteur termine." << endl;
}


/**********************/
/*FONCTION D'AFFICHAGE*/
/**********************/

void Vecteur<class T>::affiche ()
{
int i;

while (i < NbElem)
{
cout << data[i] << endl;
i++;
}
}


/*FIN DE CODE*/

Voilà, voilà.

Merci d'avance ^^

11 réponses

ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
20 déc. 2007 à 12:22
Effectivement, fait attention, tu as mis des templates dans un .cpp ....

Si tu veux tout de meme garder cela tu dois ajouter
template Vecteur<int>;

dans ton fichier .cpp

Voilà, sinon il y a la classe "vector" bien sûre mais je pensais que tu programmais cela comme un exercice...
3
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
15 déc. 2007 à 01:52
Bonsoir,

Peux-tu inclure les erreurs, ca permet de nous aider pour chercher plutôt que de faire toutes les manips !
0
Coranys Messages postés 5 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 16 décembre 2007
15 déc. 2007 à 02:00
Bonsoir,

Déjà les problèmes commencent fort :
Je travaille sous Microsoft Visual C++ et quand je double-clique sur une fonction de "Vecteur.h", il me dit "Cannot find the definition (implementation) of this function".

Il y a donc déjà un problème dans mes déclarations :s

Quand je compile le cxx, j'ai actuellement trois erreurs :

(14) error C2143: syntax error : missing ';' before 'tag::id'
(14) error C2501: 'T' : missing storage-class or type specifiers
(14) fatal error C1004: unexpected end of file found

La ligne 14 étant :
*T Vecteur<class T>::getElement () const

A l'aveuglette, j'ai mis le "*" devant le T (au lieu de derrière) pour voir.
Résultats : 102 erreurs, des "error C2143: syntax error : missing ';' before '}' en majorité

Petite édition : Merci d'avance de répondre :D
0
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
15 déc. 2007 à 12:19
Tu as marqué :
*T Vecteur<class T>::getElement () const {
    return data;
}


Et c'est :
template <class T>
T* Vecteur<T>::getElement () const {
    return data;
}


De même pour les autres méthodes.
:)
0

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

Posez votre question
Coranys Messages postés 5 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 16 décembre 2007
15 déc. 2007 à 19:29
Merci beaucoup pour cette réponse :)

Cela dit, je crois que pour l'heure ça n'a pas réglé le problème ^^'

Donc, j'ai bien repris ta syntaxe.
Ce qui donne :

/*Fichier "Vecteur.cxx"*/

#include "Vecteur.h"
#include <string>
#include <iostream.h>

#include <stdlib.h>

/*using namespace std;*/ /*Permet d'utiliser les cout avec une syntaxe moins lourde*/


/**************************************/
/*DECLARATIONS DES METHODES "getXXX()"*/
/**************************************/

template <class T>
T* Vecteur<T>::getElement () const
{
return data;
}


/**************************************/
/*DECLARATIONS DES METHODES "setXXX()"*/
/**************************************/

template <class T>
void Vecteur<T>::setElement (const int Set_Indice, const T Set_Element)
{
data[Set_Indice] = Set_Element;
}


/*************************/
/*CONSTRUCTEUR PAR DEFAUT*/
/*************************/

template <class T>
Vecteur<T>::Vecteur ()
{
cout << "Nous utilisons le constructeur PAR DEFAUT de Vecteur." << endl;
data = new type[10];
NbElem = 10;
}


/*******************************/
/*CONSTRUCTEUR D'INITIALISATION*/
/*******************************/

template <class T>
Vecteur<T>::Vecteur(const int INIT_NbElem)
{
cout << "Nous utilisons le constructeur d'INITIALISATION de Vecteur." << endl;
data = new type[INIT_NbElem];
NbElem = INIT_NbElem;
}


/*************/
/*DESTRUCTEUR*/
/*************/

template <class T>
Vecteur<T>::~Vecteur ()
{
cout << "Destructeur de Vecteur en cours..." << endl;

if (data)
{
delete data;
}

cout << "Destructeur de Vecteur termine." << endl;
}


/**********************/
/*FONCTION D'AFFICHAGE*/
/**********************/

template <class T>
void Vecteur<T>::affiche ()
{
int i;

while (i < NbElem)
{
cout << data[i] << endl;
i++;
}
}

/*FIN DE CODE*/

Le fichier "Vecteur.h" n'a pas changé donc.

J'ai maintenant deux erreurs :
(29) error C2244: 'Vecteur<T>::setElement' : unable to resolve function overload
(36) error C2954: template definitions cannot nest

La ligne 29 étant :
25 - template <class T>
26 - void Vecteur<T>::setElement (const int Set_Indice, const T Set_Element)
27 - {
28 - data[Set_Indice] = Set_Element;
29 - }

Et la ligne 36 étant :
36 - template <class T>
37 - Vecteur<T>::Vecteur ()
38 - {
39 - cout << "Nous utilisons le constructeur PAR DEFAUT de Vecteur." << endl;

Et surtout : j'ai encore ce problème qui fait que quand je double-clique sur une fonction de "Vecteur.h" (sous VC++), il me dit "Cannot find the definition (implementation) of this function". :(

Encore une fois : merci d'avance de répondre :p
0
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
16 déc. 2007 à 11:41
Hey bien tu as déclaré une signature
setElement(int,T*)
et tu lui propose un (int,T) => normal

Ensuite
template <class T>
Vecteur<T>::Vecteur ()
{
  cout << "Nous utilisons le constructeur PAR DEFAUT de Vecteur." << endl;
  data = new type[10];
  NbElem = 10;
}


new type => new T[10];
(erreure plusieurs fois)

Bon ça devrait être mieux :)
0
Coranys Messages postés 5 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 16 décembre 2007
16 déc. 2007 à 17:01
Yay! ^^
Ca compile sans aucun warning et aucune erreur! :D

Dernier problème : pourquoi est-ce que j'ai encore ce problème qui fait que quand je double-clique sur une fonction de "Vecteur.h" (sous VC++), il me dit "Cannot find the definition (implementation) of this function"? ^^'

Ca signifie qu'il n'arrivera pas à faire le lien entre le fichier h et le fichier cxx si je ne m'abuse...
Ce n'est pas normal, n'est-ce pas?

Si je devais dire... Je penserais qu'il y a un problème dans mes déclarations de prototypes mais je ne vois pas quoi :s
Il faut peut-être que je mette des "template" dans toutes mes déclarations dans le fichier .h?

Merci d'avance, ekra :p
0
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
16 déc. 2007 à 18:16
Re,

Ton fichier .h est très bien comme ca.
Je pense que le problème vient de Visual C++ (pas de la syntaxe C++) il ne doit pas faire le lien entre les fonctions que tu as déclarées et celles que tu as définies. Peut-être dois-tu simplement ajouter le fichier à ton projet, ou faire plein de clics je ne sais pas ou...

Désolé, mais je ne dispose pas de Visual C++. Je ne peux t'aider que sur le langage C++.
Bon courage !
0
Coranys Messages postés 5 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 16 décembre 2007
16 déc. 2007 à 18:30
Mmh... Je tente de tester comme ça donc.

J'ai un main avec :

cout << "Creation d'un vecteur de 5 cases..." << endl;
Vecteur<int> vec(5);
vec.affiche();
cout << endl;


Et j'ai les erreurs suivantes :

error LNK2001: unresolved external symbol "public: __thiscall Vecteur<int>::~Vecteur<int>(void)" (??1?$Vecteur@H@@QAE@XZ)
error LNK2001: unresolved external symbol "public: void __thiscall Vecteur<int>::affiche(void)" (?affiche@?$Vecteur@H@@QAEXXZ)
error LNK2001: unresolved external symbol "public: __thiscall Vecteur<int>::Vecteur<int>(int)" (??0?$Vecteur@H@@QAE@H@Z)

(pas de précision sur les lignes frauduleuses, étrangement)

J'ai mis

Vecteur<int> vec(5);
vec.affiche();

en commentaires et là, il n'y a pas d'erreur.

Y'aurait-il un problème sur ma façon de déclarer mon vecteur template d'int? :s
0
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
19 déc. 2007 à 18:55
A priori non...
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
19 déc. 2007 à 21:09
Heu question complètement stupide, pourquoi tu ne réutilise pas simplement la classe std::vector de la STL ? C'est un exercice ?

Pour ton erreur de compilation, vérifie que tu as bien mis le code des fonctions templates et des méthodes de classes templates dans le header, sinon ça ne peut pas marcher.

Bonne chance
0