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 :

Template de list chaînée incorrect cause problèmes multiples


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 55
    Points
    55
    Par défaut Template de list chaînée incorrect cause problèmes multiples
    Bonjour, excusez moi de rabaisser le niveau du forum à chaque fois lol mais j'ai un problème de compréhension de template, et vu que je sis autodidacte ma seul base est le livre de stroustrup, quand j'ai le temps parcequ'en fait j'ai un projet à rendre pour vendredi et ca me laisse pas le temps de commencer à apprendre vraiement... Méthode stupide de mon école d'ailleurs....
    Bref, je pense que je suis obligé de balancer le code, je ne balance pas l'implémentation, juste le .h, car je pense que c'est la construction du template qui pose problème, mais en procédant par élimination de mes méthodes et attributs je n'ai pas sus comprendre le(s) problème(s). D'abord le .h ensuite je vous dis mes nombreux malheurs assoicés à ma classe template. C'est une liste chaînée toute bête :
    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
    #ifndef HR_L_List_H
    #define HR_L_List_H
     
    #include <stdarg.h>
     
    //!A Linked List which can store (append, insert and delete) elements with value and retrieve their.
    template<class C> class L_List
    {
    private:
    	//!True if it is the first element of a LikedList else false
    	bool			IsFirst_B;
     
    	//!Value of the element of the L_List
    	C				Value;
     
    	//!Pointer to the next element in the L_List
    	L_List*		Next;
     
    	//!Private Constructor to build other L_List than first
    	L_List(int _num,bool _internalCall);
     
    	//Delete _number elements from index _firstIndex.
    	/*!
                    This function is added to be able to calculate Length in DeleteElements(int,int)
            */
    	void ReallyDeleteElements(int _firstIndex, int _number);
    	void AppendValueWithLength(int _index,C _value);
    	unsigned int Length;
    public:
    	//!Default Constructor
    	L_List(int _num);
     
    	//!Add a new element to the end of the list with value _value
    	void AppendValue(C _value);
     
    	//!Add _num new elements to the end of the list with values ...
    	void AppendValues(int _num,...);
     
    	//!Insert new element after element with value _value _prevIndex of the list
    	void InsertElement(int _nextIndex,C _value);
     
    	//!Set the value of element _index to _value
    	void SetElement(int _index,C _value);
     
    	//!Return the element _index value
    	C GetElement(int _index);
     
    	//Delete _number elements from index _firstIndex
    	bool DeleteElements(int _firstIndex,int _number);
     
    	//!Swap the value of elements _index1 and _index2
    	void Swap(int _index1,int _index2);
     
    	//!Return the number of elements of the Linked List
    	unsigned int GetLength();
     
    	~L_List();
    };
     
    #endif
    Je sais que j'aurais pu utiliser la stl mais j'ai pas encore eu le temps de la tester et je suis obligé en plus de faire chez moi ce qu'on devrais faire en cours : apprendre. Donc j'ai voulu essayer les template avec une liste chaînée pour apprendre plusieurs chose en une.
    Mon problème est que je ne peut pas instancier une L_List dans une classe. par exemple, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class machin
    {
    	L_List<int> truc;
    	machin();
    };
    il me dis que mon constructeur dans le .cpp de la classe machin n'est pas correct. Je ne me rappel plus de l'erreur exacte vu que mon .dsp et .dsw sont corrompus il faut que je refasse un projet et remette tous dedans, j'ai pas eu le temps et je sui préssé...
    Bref j'ai fais ça dans machin.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    machin<int>::machin()
    {
     
    }
    Et là j'ai une autre erreur (vraiment dsl de ne pas donné plus de détail j'avais pas prévu que mon fichier serait corrompu...)

    Pourtant j'ai pas de problemes dans ma classe machin si je lui met seulement en attribut un template avec 1 attribut (même un pointeur) et une ou deux méthodes intutile (print ou autre chose), je comprends pas....

    Je ne sais pas coment faire, j'ai un autre problème, à un moment j'utilise L_List pour stocker des objets2D (en openGL des objets collé à la camera en gros) et dans c'est objets 2D il y a plusieurs pointeurs parceque je veux pas créeer plusieurs materiaux par exemple ou plusieurs font pour rien donc dans la classe Objet2D il y a un pointeur sur un matériau et un sur une font (pour du texte). Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Objet2D> objs; //Je cré une liste d'Objet2D
    objs.GetElement(1).Material_Mat=new Material();//GetElement(1) recupere le second element de la liste d'Objet2D et Material_Mat c'est mon material.
    Il me dis que objs.GetElement(1).Material_Mat n'est pas une lvalue, et ce pour tout acces a un pointeur dans un element d'une Liste L_List. Je ne comprend pas, un pointeur est forcement une lvalue il me semble??????
    Merci pour ceux qui pourront m'éclairer.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si tu n'es pas plus clair, c'est difficile de t'aider sans jouer aux devinettes. Essayons quand meme: http://c.developpez.com/faq/cpp/?pag...VERS_templates
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    la classe liste n'a que ces deux constructeurs :
    • L_List(int _num,bool _internalCall) qui est privé
    • L_List(int _num)

    dans ces conditions tu ne peux pas ecrire "L_List<int> truc" car tu n'a pas defini de constructeur sans parametre, cela n'a donc aucun rapport avec les templates !
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 55
    Points
    55
    Par défaut
    Plus clair... Je suis désolé je sais pas quoi dire de plus, mais peut-être que j'en ai justement dis trop... Pour faire simple :
    Problème n°1 : j'ai créé un template L_List et je ne peux pas du tout l'instancier dans une classe. Je peux instancier L_List n'importe ou mais pas dans une classe... c'est pour ça que j'ai poster le .h, pour qu'on me dise ou est le problème dans mon template, le .cpp est inutile vu que si j'enlève le contenu des méthode c'est pareil! Le problème viens forcément de mon template.
    Problème n°2 : Mettons que j'instancie un L_List d'Objet2D en lui mettant 3 d'éléments : L_List<Objet2D> liste(3). Objet2D est une classe qui contient un pointeur sur un objet Material (je n'ai pas de problème pour les classes sans pointeurs), quand je veux effectuer une opération sur le pointeur, par exemple liste.GetElement(0).Material=new Material(), ca ne compile pas, il dit que liste.GetElement(0).Material n'est pas une lvalue. Et je ne sais pas y remédier tout simplement. Je suis étonné car pour moi un pointeur c'est justement une lvalue puisqu'il me semble bien qu'une lvalue c'est un objet non?

    Merci beaucoups bruno_pages, je fais vraiment toujours des erreurs sur des trucs hyper basique.... En fait j'avais pas fait de constructeur vide parceque je voulais gardé l'esprit de faire du code qui peut être utilisé par d'autres, même si c'est pas le cas, donc je trouvais ça plus propre de forcer l'utilisateur a rentrer une valeur même si c'est 0. En même temps je vais faire un constructeur qui met 0 elements d'office. Je n'ai pas encor essayer, il faut que je m'amuse a reconstruire un projet vu que le mien est corrompu, je pense que ça peut résoudre le premier problème, mais pas le second ci-dessus puisque ça déconne après instanciation d'une L_List avec plusieurs éléments en paramètre...

    J'avais oublié une quéstion supplémentaire, j'ai vu qu'on mettait souvent l'implémentation d'un template dans le .h direct mais du coups un utilisateur vois tout le code... Alors on peut implémenter dans un .cpp mais il faut l'inclure et ça mange beaucoups plus de ressources. La fonction export ne marche apperement sur aucun compilateur. N'y a t'il pas une meilleur solution que de tout mettre dans le .h?

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Citation Envoyé par Coelacanthe
    Problème n°1 :j'ai créé un template L_List et je ne peux pas du tout l'instancier dans une classe ... Le problème viens forcément de mon template.
    comme je l'ai dis le probleme est extremement simple et viens de l'absence d'un constructeur que tu appelles, tu auras la meme chose quelque soit l'endroit ou tu ecriras L_List<int> truc; : tu ne peux touit simplement pas appeler une fonction (contructeur ou non) qui n'existe pas. Ce n'est pas non plus lie au templates, tu auras la meme chose avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class L_List
    { 
    .....
    L_List(int _num,bool _internalCall);
    L_List(int _num);
    ...};
     
    L_List truc;
    Citation Envoyé par Coelacanthe
    Problème n°2 : ...liste.GetElement(0).Material=new Material(), ca ne compile pas, il dit que liste.GetElement(0).Material n'est pas une lvalue.
    comme tu ne donnes pas la definition de Objet2D, je ne peux pas t'aider car je ne connais pas le type de Material_Mat, mais le probleme n'est peut etre pas la, car ta ligne List<Objet2D> objs; n'est pas compilable a cause de l'erreur precedante, dans ce cas le type de objs est inconnu, celui de l'expression objs.GetElement(1).Material_Mat l'est donc aussi et il te dis que ce n'est pas une lvalue
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 55
    Points
    55
    Par défaut
    Merci de tes reponses, je n'ai pas pu repondre tout de suite car je n'ai pas eu le temps. En fait j'ai réctifier l'erreur et j'ai fais un constructeur par défaut sans paramatres (Visual c++ 6.0 est bizzard j'ai enlevé les commentaire sur mon instantiation : erreur. J'efface le debug : erreur quand meme. J'effece l'instanciation et je recopie ca fonctionne... Ne pas chercher). Bon donc je peut instancié n'importe ou et c'est cool. Mais le probleme deux je ne le comprend pas, en fait j'avais pas fais attention mais il ne veut pas utiliser l'operateur = on dirais, ce n'est pas Objet2D car je fais toujours mes debugage avec des version simplifiée en l'occurence voici la classe que j'utilise pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class petiteClasse
    {
    public:
    	float a;
    	void SetA(float _a);
    	petiteClasse();
    };
    Et ensuite quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L_List<petiteClasse> Cla(3);
    Cla.GetElement(0).a=7.5f;
    voici l'erreur :
    error C2106: '=' : left operand must be l-value

    par contre si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    L_List<petiteClasse> Cla(3);
    Cla.GetElement(0).SetA(12.3f)=0;
    Pas de problème.Il veut bien accéder au fonction mais je peux pas affecter une valeur aux attributs?? J'ai fait un s=constrcteur par recopie mais ca deconne encor, de toute facon c'est idiot puisque ce n'est pas à L_List que j'affecte une valeur. Je ne comprend pas. Je ne sais pas ou ca bug et je ne sais pas quoi envoyé de lus du coups.

  7. #7
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    desole de ne pas l'avoir vu plus tot, mais effectivement GetElement retourne une value et non une l-value, il faut que tu changes sont profil en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C & GetElement(int _index);
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 55
    Points
    55
    Par défaut
    Ah oui, merci!!!!!!!! Ne soit pas désolé vu que moi je l'ai pas vu du tout!!! Merci beaucoups! En fait une lvalue doit forcement etre un objet et moi je renvoie une pauvre valeur...

    Merci!!!!

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/09/2007, 17h21
  2. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  3. Problème de listes chaînées ou de saisie
    Par mathrb dans le forum C
    Réponses: 7
    Dernier message: 12/03/2007, 12h52
  4. Problème listes chaînées et fichier texte
    Par khayyam dans le forum Pascal
    Réponses: 2
    Dernier message: 24/01/2007, 20h11
  5. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15

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