[C++] Classe template vecteur.

Résolu
Coranys Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
ekra Messages postés 1870 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   342
 
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   Statut Membre Dernière intervention   342
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   342
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   342
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   342
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   342
 
A priori non...
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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