[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 -
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 ^^
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 ^^
A voir également:
- [C++] Classe template vecteur.
- Classe ram - Guide
- Bluetooth mercedes classe a - Forum Autoradio
- Vecteur sur word ✓ - Forum Word
- Dans le code de la page, modifiez la couleur de fond de la classe .pix. - Forum Réseaux sociaux
- Coordonnées de vecteurs en colone avec Word 2021 ✓ - Forum Word
11 réponses
Effectivement, fait attention, tu as mis des templates dans un .cpp ....
Si tu veux tout de meme garder cela tu dois ajouter
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...
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...
Bonsoir,
Peux-tu inclure les erreurs, ca permet de nous aider pour chercher plutôt que de faire toutes les manips !
Peux-tu inclure les erreurs, ca permet de nous aider pour chercher plutôt que de faire toutes les manips !
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
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
Tu as marqué :
Et c'est :
De même pour les autres méthodes.
:)
*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.
:)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
Hey bien tu as déclaré une signature
setElement(int,T*)
et tu lui propose un (int,T) => normal
Ensuite
new type => new T[10];
(erreure plusieurs fois)
Bon ça devrait être mieux :)
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 :)
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
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
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 !
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 !
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
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
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
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