Rechercher : dans
Par :

[C++] Classe template vecteur.

Dernière réponse le 20 déc 2007 à 12:22:30 Coranys, le 14 déc 2007 à 23:44:02 
 Signaler ce message aux modérateurs

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 ^^

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « [C++] Classe template vecteur. » dans :
Introduction à la STL en C++ (standard template library) Voir Introduction Principales classes de la STL std::pair std::list std::vector std::set std::map Les iterators iterator et const_iterator reverse_iterator et const_reverse_iterator Les algorithmes ...
Les templates en C++ Voir Introduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
Le mot-clé static ou les attributs et méthodes de classe en POO Voir(NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.) Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore,...
Les fonctions en C++ : surcharge et paramètres par défaut. VoirLes fonctions en C++ : surcharge et paramètres par défaut. 1. La surcharge de fonctions et méthodes de classes, dont le constructeur 2. Utilisation des paramètres par défaut En C++, une même fonction ou méthode de classe peut être...
PHP - Les classes VoirLa notion de classe Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la...
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...
Classe et instance d'objet VoirLa notion de classe On appelle classe la structure d'un objet, c'est-à-dire la déclaration de l'ensemble des entités qui composeront un objet. Un objet est donc « issu » d'une classe, c'est le produit qui sort d'un moule. En réalité on dit qu'un...

1

ekra, le 15 déc 2007 à 01:52:45

Bonsoir,

Peux-tu inclure les erreurs, ca permet de nous aider pour chercher plutôt que de faire toutes les manips !
Ceci est une signature.

Répondre à ekra

2

Coranys, le 15 déc 2007 à 02:00:59

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

Répondre à Coranys

3

ekra, le 15 déc 2007 à 12:19:44

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.
:)
Ceci est une signature.

Répondre à ekra

4

Coranys, le 15 déc 2007 à 19:29:44

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

Répondre à Coranys

5

ekra, le 16 déc 2007 à 11:41:34

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 :)

Ceci est une signature.

Répondre à ekra

6

Coranys, le 16 déc 2007 à 17:01:03

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

Répondre à Coranys

7

ekra, le 16 déc 2007 à 18:16:21

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 !
Ceci est une signature.

Répondre à ekra

8

Coranys, le 16 déc 2007 à 18:30:36

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

Répondre à Coranys

9

ekra, le 19 déc 2007 à 18:55:26

A priori non...
Ceci est une signature.

Répondre à ekra

10

mamiemando, le 19 déc 2007 à 21:09:51

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

Répondre à mamiemando

11

 ekra, le 20 déc 2007 à 12:22:30
  • +1

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...
Ceci est une signature.

Répondre à ekra