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 :

Pointeur de tableau Template


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut Pointeur de tableau Template
    Bonjour, j'explique mon soucis, j'ai un vecteur de template que je passe a une fonction. je le modifie dans cette fonction mais lorsque je l'affiche a la sortie de la fonction il n'a pas été modifié??

    voici le bout de code:

    l'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    addContrat(vectV,vectCl);
    	vectCl->affiche();

    le code:

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    void addContrat(Vecteur<Vehicule> *pVehicule,Vecteur<Client> *pClient)
    {
    	cout<<" Nouveaux contrats"<<endl;
    	cout<<"-------------------"<<endl;
     
    	char choix;
    	cout<<"Est-ce un contrat d'assurance pour voiture [(o)ui - (n)on]? ";
    	cin>>choix;
    	system("clear");
    	fpurge(stdin);
     
    	FichierClient client("/Users/juliengarciagonzalez/client.dat");
    	if(choix=='o')
    	{
    		cout<<" Nouveaux contrats Assurance Vehicule"<<endl;
    		cout<<"--------------------------------------"<<endl;
     
    		FichierContratVehicule contratVeh("/Users/juliengarciagonzalez/contratVeh.dat");
    		ContratAssuranceVehicule CA;
    		cin>>CA;
    		pClient=addCL(pClient);
    		pVehicule=addVehicule(pVehicule);
     
    		Client Cl;
    		Cl=pClient->getElement(countCl-1);
    		CA.setIdClient(Cl.getIdentification());
    		client.save(Cl);
     
    		Vehicule veh;
    		veh=pVehicule->getElement(countV-1);
    		char buf[7];
    		strcpy(buf,veh.getImmatriculation());
    		CA.setCAVehicule(buf);
    		contratVeh.save(CA);
     
    		return;
    	}
    	cout<<" Nouveaux contrats Assurance"<<endl;
    	cout<<"-----------------------------"<<endl;	
    	FichierContrat contrat("/Users/juliengarciagonzalez/contrat.dat");
     
    	ContratAssurance CA;
    	cin>>CA;
    	pClient=addCL(pClient);
     
    	Client Cl;
    	Cl=pClient->getElement(countCl-1);
    	CA.setIdClient(Cl.getIdentification());
    	client.save(Cl);	
    	contrat.save(CA);	
    	return;
    }
     
    Vecteur<Vehicule> * addVehicule(Vecteur<Vehicule> *p)
    {
    	Vecteur<Vehicule> *pNew = new Vecteur<Vehicule>(countV+1);
     
    	cout<<" Ajout d'un vehicule"<<endl;
    	cout<<"-------------------"<<endl;
    	*pNew=*p;
    	Vehicule mpTemp;
    	cin>>mpTemp;
     
    	pNew->setElement(countV, mpTemp);
    	countV++;
    	delete p;
    	p=pNew;
    	return p;
    }
     
    Vecteur<Client> * addCL(Vecteur<Client> *p)
    {
    	Vecteur<Client> *pNew = new Vecteur<Client>(countCl+1);
     
    	cout<<" Ajout d'un client"<<endl;
    	cout<<"-------------------"<<endl;
    	*pNew=*p;
    	Client mpTemp;
    	cin>>mpTemp;
     
    	pNew->setElement(countCl, mpTemp);
    	countCl++;
    	delete p;
    	p=pNew;
    	return p;
    }
    Merci d'avance

    julien

  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 : 51
    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
    Citation Envoyé par garciajulien Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		pVehicule=addVehicule(pVehicule);
    Là tu modifie ton pointeur pour qu'il pointe sur autre chose. Pas surprenant que tu ne vois rien de modifié à l'endroit où il pointait initialement.

    Par contre, sans connaître ta classe Vecteur, difficile de mieux t'aider.
    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
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Pourquoi passer tes vecteurs par pointeurs et non par référence?
    Pour ton problème, l'erreur est là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		pClient=addCL(pClient);
    		pVehicule=addVehicule(pVehicule);
    Lorsque tu passe un pointeur, c'est pour modifier la valeur pointée et non son adresse.
    Pourquoi dans addVehicule et addCL réalloué un nouveau vecteur pour ajouter le dernier élément? Ta logique est un peu surprenant: tu rajoutes un élément au vecteur et ensuite tu l'utilises pour renseigner ces valeurs? En restant dans ton optique tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void addVehicule(Vecteur<Vehicule> &_vect_vehicule)
    {
       _vect_vehicule.push_back(Vehicule());
    }
    Mais, pourquoi ne pas faire (j'ai repris qu'un bout, à transposer partout):
    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
     
    /*
    		pClient=addCL(pClient);
    		pVehicule=addVehicule(pVehicule);
     
    		Client Cl;
    		Cl=pClient->getElement(countCl-1);
    		CA.setIdClient(Cl.getIdentification());
    		client.save(Cl);
    */
    		Client Cl;
    		CA.setIdClient(Cl.getIdentification());
    		client.save(Cl);
    		pClient->push_back(Cl);
    ....
    [EDIT]: effectivement, j'ai supposé que ta classe Vecteur suivait std::vector. D'ailleurs, pourquoi ne pas utiliser directement celle-ci?

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    car je dois créer moi meme une classe vecteur pour mon cours.

    (quest-ce que ce push.back?)


    voici ma classe vecteur

    header:

    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
    /*
     *  Vecteur.h
     *  ISL1Q
     *
     *  Created by Julien Garcia Gonzalez on 6/11/08.
     *  Copyright 2008 __MyCompanyName__. All rights reserved.
     *
     */
    #ifndef _VECTEUR
    #define _VECTEUR
    #include <iostream>
    #include "Personne.h"
    #include "ContratAssurance.h"
    using namespace std;
     
    template<class T> class Vecteur
    {
    	private:
    		T *data;
    		int nbrElem;
    		int *occupation;
     
    	public:
    		//Constructeur
    		Vecteur(int n=10);
    		Vecteur(const Vecteur<T>& vect);
     
    		//Destructeur
    		~Vecteur();
     
    		//Fontions
    		void affiche();
    		int indiceValide(int empl);
    		int estOccupe(int empl);
    		T& retireElement(int empl);
    		Vecteur& operator=(const Vecteur& vect);
     
    		//Setter
    		void setElement(int empl,T dNew);
     
    		//Getter
    		T& getElement(int empl);
    		int getNbrElement(){return nbrElem;}
    };
    #endif
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    /*
     *  Vecteur.cpp
     *  ISL1Q
     *
     *  Created by Julien Garcia Gonzalez on 6/11/08.
     *  Copyright 2008 __MyCompanyName__. All rights reserved.
     *
     */
     
    #include <iostream>
    #include "Vecteur.h"
    using namespace std;
     
    template<class T>
    Vecteur<T>::Vecteur(int n)
    {
     
    	data=new T[n];
    	occupation=new int[n];
     
    	nbrElem=n;
    	for(int i=0;i<nbrElem;i++)
    	*(occupation+i)=0;
    }
     
    template<class T>
    Vecteur<T>::Vecteur(const Vecteur<T>& vect)
    {
    	int i;
    	for(i=0;i<nbrElem;i++)
    		{
    			*(data+i)=*(vect.data+i);
    			*(occupation+i)=*(vect.occupation+i);
    		}
    }
    template<class T>
    Vecteur<T>& Vecteur<T>::operator=(const Vecteur& vect)
    {
    	int i,nbrTemp;
     
    	if(nbrElem>=vect.nbrElem)
    		nbrTemp=vect.nbrElem;
    	else
    		nbrTemp=nbrElem;
     
    	for(i=0;i<nbrTemp;i++)
    		{
    			*(data+i)=*(vect.data+i);
    			*(occupation+i)=*(vect.occupation+i);
    		}
    	return *this;
    }
     
    template<class T>
    Vecteur<T>::~Vecteur()
    {
    	delete []data;
    	delete []occupation;
    }
     
    template<class T>
    void Vecteur<T>::affiche()
    {
    	for(int i=0;i<nbrElem;i++)
    	{
    		if(*(occupation+i)==1)
    			cout<<*(data+i)<<" ";
    		else
    			cout<<"-- ";
    	}
    }
     
    template<class T>
    int Vecteur<T>::indiceValide(int empl)
    {
    	if(empl<=nbrElem)
    		return 1;
     
    	return 0;
    }	
     
    template<class T>
    int Vecteur<T>::estOccupe(int empl)
    {
    	return *(occupation+empl);
    }
     
    template<class T>
    void Vecteur<T>::setElement(int empl,T dNew)
    {
     
    	*(occupation+empl)=1;
    	*(data+empl)=dNew;
    }
     
    template<class T>
    T& Vecteur<T>::getElement(int empl)
    {
    	return *(data+empl);
    }	
     
    template<class T>
    T& Vecteur<T>::retireElement(int empl)
    {
    	*(occupation+empl)=0;
     
    	return *(data+empl);
    }
     
    template class Vecteur<int>;
    template class Vecteur<Client>;
    template class Vecteur<MembrePersonnel>;
    template class Vecteur<ContratAssurance>;
    template class Vecteur<ContratAssuranceVehicule>;
    template class Vecteur<Vehicule>;
    Merci d'avance

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Formellement, push_back rajoute un élément à la fin du conteneur. Avec ta classe, il peut être remplacer par ton setElement.
    Quelques remarques sur ta classe:
    -> Elle ne gère pas correctement l'echec d'allocation dans le constructeur (cf ici).
    -> Ton constructeur par copie est incorrect (data et occupation ne sont pas contruits)
    -> Ton opérateur = n'est pas celui qu'on attendrait.
    -> il existe bool pour les valeurs true/false. Pourquoi utiliser un int pour occupation?
    -> Réminiscence du C : partout tu fais *(ptr+indice) au lieu de ptr[indice]?
    -> Tu ne teste jamais la validité des indices
    -> Attention à la séparation entre .h et .cpp pour les templates

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Et si j'utilise realloc? ca peut marcher?

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    -> Elle ne gère pas correctement l'echec d'allocation dans le constructeur (cf ici).
    -> Ton constructeur par copie est incorrect (data et occupation ne sont pas contruits)
    -> Ton opérateur = n'est pas celui qu'on attendrait.
    Je ne vois pas ce que vous dites là?

    et aussi je viens de voir que ce qui serait cool pour ma classe vecteur c'est la fonction resize de vector mais moi je dois utiliser ma classe pas la classe vector donc est-ce qu'il existe autre chose pour resize?

    merci
    Ju

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je ne vois pas ce que vous dites là?
    Un constructeur par copie et un opérateur d'affectation sont toujours définis par défaut en faisant des copies ou des affectations membre à membre.
    Or, dans ton cas, ça risque de tout casser. Il faut soit que tu redéfinisses ces choses comme il faut, soit que tu les désactives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	data=new T[n];
    	occupation=new int[n];
    Ce code produira une fuite mémoire si new int[n] lève une exception, puisque data ne sera pas libéré.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par garciajulien Voir le message
    Et si j'utilise realloc? ca peut marcher?
    Euh, non. Pourquoi faire????

    Citation Envoyé par loufoque Voir le message
    Un constructeur par copie et un opérateur d'affectation sont toujours définis par défaut en faisant des copies ou des affectations membre à membre.
    Or, dans ton cas, ça risque de tout casser. Il faut soit que tu redéfinisses ces choses comme il faut, soit que tu les désactives.
    Relire le code: ils sont redéfinis mais incorrect !

    Citation Envoyé par garciajulien Voir le message
    Je ne vois pas ce que vous dites là?
    -> Elle ne gère pas correctement l'echec d'allocation dans le constructeur (cf ici).
    Cf la réponse de loufoque. Si la seconde allocation échoue, le premier pointeur est perdu. C'est le mécanisme des exceptions.

    Citation Envoyé par garciajulien Voir le message
    Je ne vois pas ce que vous dites là?
    -> Ton constructeur par copie est incorrect (data et occupation ne sont pas contruits)
    L'appel du constructeur par copie n'est pas précédé de l'appel du constructeur par défaut. Donc this->data et this->occupation sont invalides, quant tu va essayer de copier des données dedans
    Citation Envoyé par garciajulien Voir le message
    Je ne vois pas ce que vous dites là?
    -> Ton opérateur = n'est pas celui qu'on attendrait.
    Pour l'opérateur =, on s'attend à ce que la partie de gauche soit 'recopié' sur la partie de droite. Or, tu ne recopie qu'une partie des valeurs. C'est la sémantique (le sens) de l'opérateur qui est surprenant (pour ne pas dire erroné!).

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    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
    template<class T>
    Vecteur<T>::Vecteur(const Vecteur<T>& vect)
    {
    	int i;
     
    	if(!this->data)
    		data=new T[vect.nbrElem];
    	if(!this->occupation&&this->data)
    		occupation=new int[vect.nbrElem];
     
    	for(i=0;i<nbrElem;i++)
    		{
    			*(data+i)=*(vect.data+i);
    			*(occupation+i)=*(vect.occupation+i);
    		}
    }
    template<class T>
    Vecteur<T>& Vecteur<T>::operator=(const Vecteur& vect)
    {
    	int i,nbrTemp;
     
    	if(nbrElem>=vect.nbrElem)
    		nbrTemp=vect.nbrElem;
    	else
    	{
    		nbrTemp=nbrElem;
    		this->nbrElem=nbrElem;
    	}
     
    	if(!this->data)
    		data=new T[this->nbrElem];
    	if(!this->occupation&&this->data)
    		occupation=new int[this->nbrElem];
     
    	for(i=0;i<nbrTemp;i++)
    		{
    			*(data+i)=*(vect.data+i);
    			*(occupation+i)=*(vect.occupation+i);
    		}
    	return *this;
    }

    Voilà mes constructeur de copie et mon opérateur d'affection
    est-ce correct?

    de plus, il me faudrai pouvoir faire un push_back la dessus hors je ne peux pas utiliser la classe std::vector?

    comment puis-je faire pour augmenter la taille de mon tableau passé en paramètre?

    Merci

    ju

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Pour modifier l'adresse pointée, j'ai trouvé dans ma fonction j'envoie un pointeur de référence:
    objet *& monvect

    et ca marche nickel!!!

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Ceci n'est pas un pointeur de référence, mais une référence vers un pointeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par garciajulien Voir le message
    Pour modifier l'adresse pointée, j'ai trouvé dans ma fonction j'envoie un pointeur de référence:
    objet *& monvect

    et ca marche nickel!!!
    Tu as surtout de la chance que ça tombe en marche !

    Citation Envoyé par garciajulien Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template<class T>
    Vecteur<T>::Vecteur(const Vecteur<T>& vect)
    {
    	int i;
     
    	if(!this->data)
    		data=new T[vect.nbrElem];
    	if(!this->occupation&&this->data)
    		occupation=new int[vect.nbrElem];
    100% de chance qu'en release data et occupation ne valent pas NULL et que ça plante ! Tu devrais tout simplement les allouer! Mais comme pour ton autre constructeur, tu devrais gérer l'échec du new (exceptions levées).

    Citation Envoyé par garciajulien Voir le message
    template<class T>
    Vecteur<T>& Vecteur<T>::operator=(const Vecteur& vect)
    {
    int i,nbrTemp;

    if(nbrElem>=vect.nbrElem)
    nbrTemp=vect.nbrElem;
    else
    {
    nbrTemp=nbrElem;
    this->nbrElem=nbrElem;
    }

    if(!this->data)
    data=new T[this->nbrElem];
    if(!this->occupation&&this->data)
    occupation=new int[this->nbrElem];

    for(i=0;i<nbrTemp;i++)
    {
    *(data+i)=*(vect.data+i);
    *(occupation+i)=*(vect.occupation+i);
    }
    return *this;
    }[/CODE]


    Voilà mes constructeur de copie et mon opérateur d'affection
    est-ce correct?
    Non. Tu ne fais pas une vrai copie puisque this peut avoir moins d'element que l'objet passer en paramètre !
    Une solution souvent mise en place ressemble à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<class T>
    Vecteur<T>& Vecteur<T>::operator=(const Vecteur& vect)
    {
           Vecteur<T> temp(vect);
           Swap(this,temp);
    }
    avec Swap(Vecteur<T>&rhs,Vecteur<T>lhs)
    {
       std::swap(rhs.data,lhs.data);
       std::swap(rhs.occupation,lhs.occupation);
       std::swap(rhs.nbrElem,lhs.nbrElem);
    }
    Citation Envoyé par garciajulien Voir le message
    de plus, il me faudrai pouvoir faire un push_back la dessus hors je ne peux pas utiliser la classe std::vector?
    En fait, ta méthode setElement devrait te suffire.

    Citation Envoyé par garciajulien Voir le message
    comment puis-je faire pour augmenter la taille de mon tableau passé en paramètre?
    A partir du moment où tu as décidé d'utiliser un tableau pour ton vecteur, il ne te reste plus qu'a en réalloué un de taille un peu plus grande à chaque fois.

  14. #14
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    tiens j'avais posté ça sur un topic similaire y'a pas longtemps :

    http://www.research.att.com/~bs/except.pdf

    c'est un papier de BS qui traite de l'exception safety au travers d'un exemple concret, une classe vector basique mais STL-like.

    Tu verras notamment qu'il préfère utilisait les uninitialized_fill pour éviter les new et surtout qu'au lieu d'utiliser des exceptions il dérive d'une classe de base qui gére uniquement l'allocation dynamique et qui implémente le RAII.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  2. Accès le plus rapide: Pointeur ou tableau?
    Par homeostasie dans le forum C
    Réponses: 21
    Dernier message: 01/09/2006, 14h08
  3. [VB.NET] Pointeur vers tableau
    Par b_lob dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/08/2006, 16h06
  4. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  5. Pointeur et TAbleau
    Par melmouj dans le forum C
    Réponses: 20
    Dernier message: 25/09/2005, 16h13

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