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

SL & STL C++ Discussion :

[STL] Classe avec une Pile , problème de méthode


Sujet :

SL & STL C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut [STL] Classe avec une Pile , problème de méthode
    Bonjour/'soir ,
    voilà , je poste dans l'urgence , je suis quelque peu pressé par le temps , j'espère néanmoins que vous prêterez attention à mon problème.

    Je veux faire une classe avec comme principale attributs une pile STL acceptant des std::string , j'ai défini les fonctions de base de la pile STL sur ma classe pour pouvoir y accéder facilement. A la compilation ca marche tant que n'instancie pas de pile et que je tente pas d'utliser ma méthode push().

    Voilà mon 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
    #include <stack>
     
    class pile{
    	//attributs
    	protected:
    	std::stack<std::string> p;
     
    	//méthodes
    	public:
    	bool empty() const;
    	void push(std::string&);
    	//void push(std::string);
    	void pop();
    	int size();
    	std::string& top();
     
     
    };
    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
    #include <iostream>
     
    #include "pile.hh"
     
    bool pile::empty() const{
    	return p.empty();
    }
     
    void pile::push(std::string& s){
    	p.push(s);
    }
    /*
    void pile::push(std::string s){
    	p.push(s);
    }*/
     
    void pile::pop(){
    	p.pop();
    }
     
    int pile::size(){
    	return p.size();
    }
     
    std::string& pile::top(){
    	return p.top();
    }
    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
    #include <iostream>
    #include <stack>
     
    #include "pile.hh"
     
    int main(){
    	pile P;
    	std::string s("test");
    	std::string& r = s;
    	P.push(r);
     
    	/*std::stack<std::string> p;
    	p.push(std::string("test"));
    	std::cout << p.top();*/
     
    }
    L'erreur de compilation quand je tente de compil mon .cc de test , le pile.cc étant compilé à part :
    g++ test.cc -Wall -o test
    /tmp/ccqeNGLU.o: In function `main':
    test.cc.text+0xcd): undefined reference to `pile::push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
    collect2: ld a retourné 1 code d'état d'exécution
    camu@ubuntu:~/c++/projet$ g++ test.cc -Wall -o test
    /tmp/ccoQzJtb.o: In function `main':
    test.cc.text+0xd3): undefined reference to `pile::push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
    collect2: ld a retourné 1 code d'état d'exécution
    Je ne comprend pas exactement le message d'erreur , si quelqu'un de familier avec std::string et les piles pouvait m'aider , ca me serait d'un grand secours

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu n'indiques pas pile.cc dans ta ligne de commande de compilation, il ne risque donc pas de trouver l'implémentation des fonctions de ta classe pile

    Sinon quelques remarques :
    - Le paramètre de push devrait être pris par référence constante (voir FAQ si ça reste obscur pour toi).
    - Ca te permettra de faire p.push("test") plutôt que de sortir 3 lignes de code inutilement.
    - Si ta classe reprend telles qu'elles les fonctions de std::stack, tu peux utiliser l'héritage privé, qui modélise bien une relation "est implémenté en terme de" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class pile : private std::stack<std::string>
    {
    public :
     
        typedef std::stack<std::string> base;
        using base::push;
        using base::pop;
        using base::size;
        ...
    };

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu n'indiques pas pile.cc dans ta ligne de commande de compilation, il ne risque donc pas de trouver l'implémentation des fonctions de ta classe pile
    Merci bien , erreur stupide de ma part.

    Citation Envoyé par Laurent Gomila
    - Si ta classe reprend telles qu'elles les fonctions de std::stack, tu peux utiliser l'héritage privé, qui modélise bien une relation "est implémenté en terme de" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class pile : private std::stack<std::string>
    {
    public :
     
        typedef std::stack<std::string> base;
        using base::push;
        using base::pop;
        using base::size;
        ...
    };
    Je ne me suis pas encore penché sur l'héritage privé , toutefois ca a l'air bien pratique , je m'y pencherai dès que j'aurai plus de temps.

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut, une autre solution pourrait etre, tout simplement, de déclarer un alias nommé pile de ta std::stack<std::string> ... Si du moins, tu ne vois aucune objection à fournir un acces aux autres méthodes de stack :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* dans le .h */
    typedef std::stack<std::string> Pile;
    /* dans main */
    int main()
    {
        Pile strs;
        strs.push("hello");
        strs.push("world");
        /* ... */
        return 0;
    }

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

Discussions similaires

  1. Opérations avec une pile
    Par mams1 dans le forum C
    Réponses: 4
    Dernier message: 25/01/2009, 19h31
  2. Instance d'une classe avec une string
    Par beetlejuice722 dans le forum C#
    Réponses: 30
    Dernier message: 31/10/2008, 10h43
  3. Petit problème avec une pile
    Par josef24 dans le forum C
    Réponses: 12
    Dernier message: 29/10/2007, 13h00
  4. STL : Bug avec une list
    Par Winder dans le forum SL & STL
    Réponses: 1
    Dernier message: 10/05/2007, 04h03
  5. Réponses: 2
    Dernier message: 27/04/2006, 09h25

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