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

Langage C++ Discussion :

Recoder la classe Vector<T>


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2017
    Messages : 8
    Par défaut Recoder la classe Vector<T>
    Bonjour,

    En essayant recorder une version simplifiée de la classe vector<T> (en suivant le livre Advanced C++ programming), appelée Vec<T>. Mon programme se plante dès l'appel du constructeur de la classe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "stdafx.h"
    #include <iostream>
    #include "Vec.h"
     
    int main()
    {
         Vec<int> x;
     }
    Les constructeurs et le destructeur de la classe appellent respectivement les fonctions create() et uncreate() qui permettent une gestion de mémoire flexible lors de l'appel de push_back() via l'utilisation de la classe allocator<T> .

    Je ne comprend pas l'erreur affiché par le compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LNK2019	symbole externe non résolu "private: void __thiscall Vec<int>::create(void)" (?create@?$Vec@H@@AAEXXZ) référencé dans la fonction "public: __thiscall Vec<int>::Vec<int>(void)" (??0?$Vec@H@@QAE@XZ)	
    
    LNK2019	symbole externe non résolu "private: void __thiscall Vec<int>::uncreate(void)" (?uncreate@?$Vec@H@@AAEXXZ) référencé dans la fonction "public: __thiscall Vec<int>::~Vec<int>(void)" (??1?$Vec@H@@QAE@XZ)	
    
    LNK1120	2 externes non résolus	
    Quelqu'un peut m'aider svp? Merci

    --------------------------------------------------- Vec.h -------------------------------------------------------
    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
     
    #include <memory>
     
    template <class T> class Vec
    {
    public:
    	typedef T* iterator;
    	typedef const T* const_iterator;
    	typedef size_t size_type;
    	typedef T  value_type;
     
    	Vec()
    	{
    		create();
    	}
    	explicit Vec(size_type n, const T& t = T())
    	{
    		create(n, t);
    	}
     
    	// The rule of three
    	Vec(const Vec& v)
    	{
    		create(v.begin(), v.end());
    	}
    	Vec& operator=(const Vec&);
     
    	~Vec()
    	{
    		uncreate();
    	}
     
    private:
    	iterator data;    // first element in the Vec
    	iterator avail;   // (one past) the last element in the Vec
    	iterator limit;   // (one past) the allocated memory
     
    					  // facilities for memory allocation
    	std::allocator<T> alloc;
     
     
    	// allocate and initialize the underlying array
    	void create();
     
    	void create(const_iterator, const_iterator);
     
    	// destroy the elements in the array and free the memory
    	void uncreate();
     
    };
    --------------------------------------------------- Vec.cpp -------------------------------------------------------
    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
     
    #include "Vec.h"
     
    #include <memory>
    using std::allocator;
    using std::uninitialized_fill;
    using std::uninitialized_copy;
     
    template <class T> Vec<T>& Vec<T>::operator=(const Vec& rhs)
    {
    	// check for self-assignment
    	if (&rhs != this)
    	{
    		// free the array in the left-hand side
    		uncreate();
     
    		// copy elements from the right-hand to the left-hand side
    		create(rhs.begin(), rhs.end());
    	}
    	return *this;
    }
     
    template <class T> void Vec<T>::create()
    {
    	data = avail = limit = 0;
    }
     
    template<class T> void Vec<T>::create(size_type n, const T& val)
    {
    	data = alloc.allocate(n);
    	limit = avail = data + n;
    	uninitialized_fill(data, limit, val);   // reproduire 3 dans le vecteur de 1 à 2           // 1,2 <- 3
    }
     
    template<class T> void Vec<T>::create(const_iterator i, const_iterator j)
    {
    	data = alloc.allocate(j - i);
    	limit = avail = uninitialized_copy(i, j, data);  // copier le vecteur de 1 à 2 dans 3      //  1,2 -> 3
    }
     
    template<class T> void Vec<T>::uncreate()
    {
    	if (data) // alloc.deallocate() requires nonzero pointer à l'inverse de delete
    	{
    		// destroy (in reverse order) the elements that were constructed
    		iterator it = avail;
    		while (it != data)
    			alloc.destroy(--it);
     
    		// return all the space that was allocated
    		alloc.deallocate(data, limit - data);
    	}
    	// reset pointers to indicate that the Vec is empty again
    	data = avail = limit = 0;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je n'ai pas lu ton code, juste le message d'erreur (et donc je ne fais pas de commentaires sur le code lui-même), et c'est un classique de l'utilisation des templates: https://cpp.developpez.com/faq/cpp/?...tion-des-liens

    Sinon, tu parles d'un livre, mais je ne sais pas lequel c'est, tu pourrais mettre un lien ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2017
    Messages : 8
    Par défaut
    Merci JolyLoic, je ne connaissais pas cet astuce pour l'utilisation des templates. Je vais le rajouter à mon code.

    Sinon pour le livre, je me suis trompé dans le nom
    Je voulais dire : Accelerated C++ Practical programming by exemple :
    http://libertar.io/lab/wp-content/up...lerated-C-.pdf

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ce livre était très bon, mais il est désormais un peu daté. Je pense que tu peux sans soucis continuer avec, mais qu'il te sera profitable à un moment d'utiliser un ouvrage plus récent pour finaliser ton apprentissage.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Août 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Août 2017
    Messages : 8
    Par défaut
    Merci JolyLoic pour tes conseils

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

Discussions similaires

  1. problème class vector
    Par Pe04 dans le forum SL & STL
    Réponses: 2
    Dernier message: 27/02/2006, 10h45
  2. "class" vector à indice variable et fonction membr
    Par icetechnik dans le forum C++
    Réponses: 14
    Dernier message: 25/11/2005, 23h46
  3. utilisation classe vector et supression de doublons
    Par vandevere dans le forum SL & STL
    Réponses: 1
    Dernier message: 30/06/2005, 11h17
  4. [Perf]Htable vs class Vector
    Par nicoo dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 14/11/2004, 10h11
  5. [Vector] classe Vector et exception
    Par Nanoua dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 23/04/2004, 12h37

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