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

C++Builder Discussion :

Vecteur de class contenant des pointeurs


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 81
    Points
    81
    Par défaut Vecteur de class contenant des pointeurs
    Bonjour à tous!

    Je pige mal encore les pointeurs (boo-hou à moi-même).

    Je me suis créer une class qui contient un TStringList.

    De cette class je veux faire un vecteur et modifier les StringList.

    J'obtient un message d'erreur "Invalid pointer operation".

    J'ai chercher de ce côté :

    Tutoriel sur les pointeurs en dynamique

    Mais, j'ai toujours le même problème, alors me voici.

    Mes classes :

    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
    class Trajet
    {
    	public :
    		AnsiString Style;
    		TStringList *TrajetCode;
     
    		void ReInitialise();
    		~Trajet();
    		Trajet();
    };
    Trajet::Trajet()
    {
    	TrajetCode = new TStringList;
    }
    Trajet::~Trajet()
    {
    	if(TrajetCode)
    	{
    		delete TrajetCode;
    	} 
    }
    void Trajet::ReInitialise()
    {
    	TrajetCode->Clear();
    	Style = "";
    }
     
     
     
     
    class Outils
    {
    	public :
    		TStringList *OutilsStringList;
    		int Sequence;
    		int IndexDebut;
    		AnsiString Numero;
    		vector<Trajet> TrajetOutils;
    		void ReInitialise();
    		Outils();
    		~Outils();
    };
    Outils::Outils()
    {
    	OutilsStringList = new TStringList;
    }
    Outils::~Outils()
    {
    	if(OutilsStringList)
    	{
    		delete OutilsStringList;
    	}  
    }
    void Outils::ReInitialise()
    {
    	OutilsStringList->Clear();
    	Sequence = 0;
    	IndexDebut = 0;
    	Numero = 0;
    }

    Pour ce qui est du bout de 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
     
           //Variables
    	vector<Outils> ListeOutils;
    	Outils OutilsEnCours;
    	AnsiString SectionEnCours;
     
    	int IndexOfLastOutils = 0;
    	int IndexOfLastTrajet = 0;
    	unsigned int i = 0;
     
    	TStringList *FichierComplet = new TStringList;
    	AnsiString CodeToolChange = "tool";
    	AnsiString CodeStyleChange = "style";
     
    	//Chargement de mon fichier
    	FichierComplet->LoadFromFile(Fichier);
     
    	//Boucle sur mon fichier
    	while(i<FichierComplet->Count)
    	{
    		//S'il s'agit d'un tool change
    		if(FichierComplet->Strings[i] == CodeToolChange)
    		{
    			//On reinitialise la variable Outils
    			OutilsEnCours->ReInitialise();
     
    			//On l'ajoute à la liste d'outils
     
                   //-------------- Erreur survient avec cette ligne -------------//
    			ListeOutils.push_back(OutilsEnCours);
    //-------------- Erreur survient avec cette ligne -------------//
     
    			//On trouve l'index du dernier
    			IndexOfLastOutils = ListeOutils.size()-1;
     
    			//On modifie la variable section pour dire qu'on travail sur la portion trajet
    			SectionEnCours = "outils";
    		}
    		//S'il s'agit d'un style change
    		else if(TempStyleChange == CodeStyleChange)
    		{
    			//On reinitialise la variable Trajet
    			TrajetEnCours->ReInitialise();
     
    			//On l'ajoute à la liste de trajet
    			OutilsFeuille[IndexOfLastOutils].TrajetOutils.push_back(TrajetEnCours);
     
    			//On trouve l'index du dernier
    			IndexOfLastTrajet = OutilsFeuille[IndexOfLastOutils].TrajetOutils.size()-1;
     
    			//On modifie la variable section pour dire qu'on travail sur la portion trajet
    			SectionEnCours = "trajet";
     
    		}
     
    		if(SectionEnCours == "outils")
    		{
    			ListeOutils[IndexOfLastOutils].OutilsStringList->Add(FichierComplet->Strings[i]);
    		}
    		else if(SectionEnCours == "trajet")
    		{
    			ListeOutils[IndexOfLastOutils].TrajetOutils[IndexOfLastTrajet].TrajetCode->Add(FichierComplet->Strings[i]);
    		}
    	}
    	if(FichierComplet)
    	{
    		delete FichierComplet;
    	}

    Le problème est que ça ne plante pas immédiatement au premier passage dans la section problématique.

    Ça plante au 3e passage. J'imagine que puisque je ne créer pas de nouveau OutilsEnCours, le pointeur du StringList continu de pointer vers l'ancienne emplacement lorsque j'essai de le pousser à la fin de mon vecteur.

    Il fautdrait que je créer un nouveau OutilsEnCours pour chaque fois que je le pousse à la fin de mon vector? De la sorte, j'aurais un TStringList tout neuf à chaque fois?

    Enfin, pour l'instant j'ai remplacé mon TStringList par un vector<AnsiString> dans ma classe Trajet et Outils, mon code fonctionne, alors c'est ma compréhension des pointeurs qui est déficiente.

    J'ai essayer la méthode du Tutorial, mais bon, je crois que je ne pige pas quelque chose parce que ça plante avec le même message d'erreur, mais au premier passage.

    Est-ce que ce tutoriel est selon vous la méthode à adopter et ce n'est que moi qui est trop débutant pour réussir?

    Merci de votre attention!

    antoine

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut,
    Citation Envoyé par antoinelac Voir le message
    Ça plante au 3e passage. J'imagine que puisque je ne créer pas de nouveau OutilsEnCours, le pointeur du StringList continu de pointer vers l'ancienne emplacement lorsque j'essai de le pousser à la fin de mon vecteur.
    C'est tout as fait cela, le pointeur reste le même lors de la copie de l'objet.

    Citation Envoyé par antoinelac Voir le message
    Il fautdrait que je créer un nouveau OutilsEnCours pour chaque fois que je le pousse à la fin de mon vector? De la sorte, j'aurais un TStringList tout neuf à chaque fois?
    C'est une solution effectivement, si ton objet Outils EnCours est reconstruit à neuf à chaque fois, tu aura un nouveau pointeur à chaque fois.

    Citation Envoyé par antoinelac Voir le message
    Enfin, pour l'instant j'ai remplacé mon TStringList par un vector<AnsiString> dans ma classe Trajet et Outils, mon code fonctionne, alors c'est ma compréhension des pointeurs qui est déficiente.
    C'est la meilleur solution, il faut éviter au plus possible les pointeur qui sont toujours source d'erreur du au mauvaise utilisation (mais il faut quand même savoir les utilisé dans le cas ou c'est indispensable).
    Tu peut même faire mieux en utilisant un vector<string> (quitte à utiliser la stl, autant l'utilisé jusqu'au bout et ne pas mélangé conteneur stl et conteneur Borland)

    Citation Envoyé par antoinelac Voir le message
    J'ai essayer la méthode du Tutorial, mais bon, je crois que je ne pige pas quelque chose parce que ça plante avec le même message d'erreur, mais au premier passage.

    Est-ce que ce tutoriel est selon vous la méthode à adopter et ce n'est que moi qui est trop débutant pour réussir?
    Ce tutoriel date un peut, et même si il est toujours applicable, la stl offre généralement des conteneurs plus puissant et plus stable que les conteneurs Borland
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Comment ferais-tu avec TList à la place de vector ?

    A plus !

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Bonjour à tous!


    Merci Pottiez d'avoir pris le temps de répondre!

    Pour henderson, je vais essayer de montrer ce que j'ai compris du tutoriel :

    1- Tu te fais un objet TList qui pointera sur chacun de tes pointeur. De la sorte, tu va pouvoir manipuler tes pointeurs et en créer de façon dynamique. Il ne faut pas oublier de vider la TList et la détruire à la fin du programme.

    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
     
     
    //------------------------
    //Création de l'objet
    //------------------------
    TList *ListePointeur; //Dans les variables globales de ta form
     
    ListePointeur = new TList(); //Lors de la création de ta form ou n'importe où que tu juges pertinant, 
    //il faut que cette ligne soit appelée avant l'utilisation de ListePointeur (évident, mais bon...)
     
     
     
    //------------------------
    //Destruction de l'objet / nettoyage de la mémoire
    //------------------------
    //Il faut vider sa liste avant de pouvoir l'effacer
    for(int i = 0; i<ListePointeur->Count; i++)
    {
           delete (TStringList *)ListePointeur->Items[i];
    }
     
     
    //Portion finale qui efface ListePointeur lorsqu'on en n'a plus de besoin
    //Souvent lors du OnClose de ta form
    if(ListePointeur)
    {
           delete ListePointeur;
    }
    2-Il ne reste plus qu'à peupler et utiliser la TList.

    Lorsqu'on créer un nouveau Objet et on l'ajoute à la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    //Ajout d'une ligne à l'item #(ListePointeur->Count - 1) de la TList
    ((TStringList*)ListePointeur->Items[ListePointeur->Count - 1])->Add("Hello ici la ligne 1");
     
    //Ajout d'une deuxieme ligne à l'item #(ListePointeur->Count - 1) de la TList
    ((TStringList*)ListePointeur->Items[ListePointeur->Count - 1])->Add("Hello ici la ligne 2");
    Alors, pour faire simple, c'est ce que j'ai compris du tutoriel. Mais bon, je n'ai pas réussit à l'implémenter à ma class plus vaste. Je dois avoir passer à côté de quelque chose ou c'est plutôt lors de mon implémentation que je me suis planter. Mais, bon ce n'est que partie remise!

    En espérante t'avoir aider un peu henderson.

    Antoine

Discussions similaires

  1. Réponses: 31
    Dernier message: 19/09/2011, 10h37
  2. Réponses: 11
    Dernier message: 17/03/2011, 09h19
  3. Une classe contenant un pointeur sur elle même
    Par scary dans le forum Débuter
    Réponses: 38
    Dernier message: 02/04/2010, 17h59
  4. Problème classes contenant des arrays
    Par ayinay dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/02/2010, 16h57
  5. Réponses: 7
    Dernier message: 01/09/2006, 14h19

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