Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::vector `tableau' undeclared

Comment le déclarer ?

Sujet résolu
    5 août 2008 à 11:56:19

    Bonjour,

    J'avais besoin de tableau dynamique donc j'ai lu (le début) du tuto de Nanoc. J'ai donc écrit (entre autre) ceci :

    #include <vector>
    #include "FenPrincipale.h"
    
    FenPrincipale::FenPrincipale()
    {
       // Génération des widgets de la fenêtre principale
       creerZoneCentrale();
       creerActions();
       creerMenus();
       creerBarresOutils();
       creerBarreEtat();
    
       std::vector<Cellule> tableauCellule(2);
    }
    
    void FenPrincipale::creerZoneCentrale()
    {
      tableauCellule[0].setMilieu(&m_milieu);
    }
    

    Mais à la ligne tableauCellule[0].setMilieu(&m_milieu); j'ai une erreur a la compilation :

    FenPrincipale.cpp:22: error: `tableauCellule' undeclared (first use this function)
    FenPrincipale.cpp:22: error: (Each undeclared identifier is reported only once for each function it appears in.)

    Il faut déclarer le tableau dans fenetre principale.h c'est bien ca ? Parce que j'ai tenté de le faire mais j'ai dû mal le faire et c'était pire ^^ . Quel est donc ce problème ?

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2008 à 11:57:45

      Il faut que tu mettes le vector en attribut et pas comme une variable dans le constructeur si tu veux pouvoir y accéder depuis les fonctions membres.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        5 août 2008 à 12:04:22

        En C++, les variables que tu déclares à l'intérieur d'une fonction sont détruites à la fin de cette fonction. Ici, tu déclares ton tableau dans le constructeur, mais il est détruit à la fin, donc forcément tu ne peux plus l'utiliser. Comme l'a dit Nanoc, tu dois le mettre en attribut ;) .
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          5 août 2008 à 12:05:46

          Citation : gymnopaul

          En C++, les variables que tu déclares à l'intérieur d'une fonction sont détruites à la fin de cette fonction.

          Pour être plus précis ce sont les blocs { } qui "gèrent" ça.
          • Partager sur Facebook
          • Partager sur Twitter
            5 août 2008 à 12:08:18

            Comme ceci alors :

            private:
               std::vector<Cellule> tableauCellule(2);
            

            Mais j'ai la même erreur au même endroit donc j'ai pas dû bien comprendre.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              5 août 2008 à 12:21:16

              ton initialisation est mauvaise : il faut la faire dans le constructeur.
              • Partager sur Facebook
              • Partager sur Twitter
                5 août 2008 à 12:27:00

                Bah c'est ce que j'avais fais au début. Je ne comprend pas ce que vous voulez dire.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 août 2008 à 12:29:41

                  private:
                     std::vector<Cellule> tableauCellule;
                  


                  FenPrincipale::FenPrincipale() : tableauCellule(2)
                  {
                  [...]
                  


                  il veux dire ça, sans doute
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 août 2008 à 12:39:17

                    ha ok...
                    Mais ca me retourne aussi une erreur sauf que je ne la comprend pas cette fois.

                    FenPrincipale.cpp:6: instantiated from here

                    Sauf qu'a la ligne 6 il n'y a rien :

                    FenPrincipale::FenPrincipale(): tableauCellule(2)
                    { //ligne 6
                       creerZoneCentrale();
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      5 août 2008 à 13:01:45

                      le message d'erreur qui vient juste avant "instantiated from here" ?

                      a noter que la balise code possède une option debut :
                      <code type="cpp" debut="5">FenPrincipale::FenPrincipale(): tableauCellule(2)
                      { //ligne 6
                         creerZoneCentrale();
                      </code>
                      

                      qui donne :
                      FenPrincipale::FenPrincipale(): tableauCellule(2)
                      { //ligne 6
                         creerZoneCentrale();
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 août 2008 à 13:17:26

                        Citation

                        le message d'erreur qui vient juste avant "instantiated from here" ?



                        C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_vec
                        tor.h:207:   instantiated from `std::vector<_Tp, _Alloc>::vector(size_t) [with _
                        Tp = Cellule, _Alloc = std::allocator<Cellule>]'
                        FenPrincipale.cpp:6:   instantiated from here


                        Pour ce qui est du zcode je suppose que tu vois encore les n° des lignes. Moi j'ai plus le numero des lignes depuis le passage a pygment. Je pensais qu'il l'avaient viré. Du coup j'ai pas employé cette balise.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 août 2008 à 13:28:02

                          Est-ce que CEllule a un constructeur par défaut ?
                          Si c'est pas le cas, il faut soit en créer un ou spécifier dans l'initialisation du vector quel constructeur utiliser.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                          Anonyme
                            5 août 2008 à 13:31:10

                            Citation : Aravis

                            Pour ce qui est du zcode je suppose que tu vois encore les n° des lignes. Moi j'ai plus le numero des lignes depuis le passage a pygment. Je pensais qu'il l'avaient viré. Du coup j'ai pas employé cette balise.

                            Peut-être que ton design n'est pas à jour. L'officiel est très bien :) .
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 août 2008 à 13:39:19

                              Citation : Nanoc

                              Est-ce que Cellule a un constructeur par défaut ?


                              Bien sûr. Donc vous ne voyez pas d'où viens le problème ? Merde alors :( .

                              Citation : Hiura

                              Peut-être que ton design n'est pas à jour. L'officiel est très bien :) .


                              Je suis avec bluzaz justement. Et oui, j'ai vidé le cache. Bref...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 août 2008 à 13:46:11

                                Est-ce que c'est le message d'erreur au complet ?

                                Peut'on voir FenPrincipale.cpp FenPrincipale.h et Cellule.h ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                  5 août 2008 à 13:54:48

                                  Citation : Nanoc

                                  Est-ce que c'est le message d'erreur au complet ?


                                  Je sais pas comment faire un copier coller de la console. Des fois ça marche des fois pas je comprend pas. Du coup j'arrive juste a avoir des petits bouts ^^ . Allez hop un screen

                                  Image utilisateur

                                  Citation : Nanoc

                                  Peut'on voir FenPrincipale.cpp FenPrincipale.h et Cellule.h ?


                                  Je vais pas tout mettre c'est pas forcement très interessant mais je vais mettre ce qui est important.
                                  On notera que mes objets héritent d'un Qlabel c'est pour pouvoir afficher des truc a l'ecran (je maitrise pas une autre methode).


                                  #ifndef HEADER_FENPRINCIPALE
                                  #define HEADER_FENPRINCIPALE
                                  
                                  #include <QtGui>
                                  #include <vector>
                                  #include "Milieu.h"
                                  #include "cellule.h"
                                  
                                  class FenPrincipale : public QMainWindow
                                  {
                                      Q_OBJECT
                                  
                                      public:
                                          FenPrincipale();
                                  
                                      private:
                                  	void creerZoneCentrale();
                                          void creerActions();
                                          void creerMenus();
                                          void creerBarresOutils();
                                          void creerBarreEtat();
                                  
                                      private slots:
                                  
                                      private:
                                          QAction *actionQuitter;
                                  		QAction *actionModifierMilieu;
                                  		Milieu m_milieu;
                                  		std::vector<Cellule> tableauCellule;
                                  };
                                  
                                  
                                  #endif
                                  


                                  #include "FenPrincipale.h"
                                  #include "Milieu.h"
                                  
                                  FenPrincipale::FenPrincipale(): tableauCellule(2)
                                  {
                                      // Génération des widgets de la fenêtre principale
                                      creerZoneCentrale();
                                      creerActions();
                                      creerMenus();
                                      creerBarresOutils();
                                      creerBarreEtat();
                                  
                                      // Définition de quelques propriétés de la fenêtre
                                      setWindowTitle(tr("Cellule 0.0.1"));
                                  }
                                  
                                  void FenPrincipale::creerZoneCentrale()
                                  {
                                  	tableauCellule[0].setMilieu(&m_milieu);
                                  	
                                      QWidget *zoneCentrale = new QWidget;
                                      QVBoxLayout *layout = new QVBoxLayout;
                                  	    layout->addWidget(&m_milieu);
                                  		layout->addWidget(&tableauCellule[0]);
                                  	
                                      zoneCentrale->setLayout(layout);
                                      setCentralWidget(zoneCentrale);
                                  }
                                  


                                  #ifndef HEADER_CELLULE
                                  #define HEADER_CELLULE
                                  
                                  #include <QtGui>
                                  #include "Milieu.h"
                                  
                                  class Cellule : public QLabel
                                  {
                                  	Q_OBJECT
                                  
                                  	public:
                                  		Cellule(); //constructeur par defaut
                                  		Cellule(const Cellule &celluleACopier); //constructeur de copie
                                  		~Cellule();		
                                  		void setMilieu(Milieu *milieu);		
                                  		void setAge(int valeur);
                                  		int getAge();
                                  	
                                  	private:
                                  		void veillir();
                                  		void utiliserEnergie();
                                  		void creerEnergie();
                                  		void afficherStatut();
                                  		bool estVivante();
                                  	
                                  	private slots:
                                  		void vie();
                                  	
                                  	private:
                                  		int m_energie;
                                  		int m_age;
                                  		bool m_vie;
                                  		Milieu *m_milieu;
                                  		QTimer *timer;
                                  };
                                  
                                  #endif
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    5 août 2008 à 14:01:08

                                    Tu ne peux pas avoir de constructeur de copie avec QLabel car il est privé (pour, justement empêcher la copie).

                                    Pour la copie depuis la console c'est compliqué, je te l'accorde : clic droit, sélection, déplace le curseur (flèche) pour trouver le début de la sélection, puis tu déplace avec <maj> enfoncé, puis <enter>.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 août 2008 à 14:08:08

                                      Citation : Hiura

                                      Tu ne peux pas avoir de constructeur de copie avec QLabel car il est privé (pour, justement empêcher la copie).


                                      Je sais pas je viens d'écrire ca pour passer le temps puisque ca compile pas a cause du vector. J'ai pas essayé de compiler. Ok je vire ^^ .

                                      Citation : Hiura

                                      Pour la copie depuis la console c'est compliqué, je te l'accorde : clic droit, sélection, déplace le curseur (flèche) pour trouver le début de la sélection, puis tu déplace avec <maj> enfoncé, puis <enter>.


                                      Ca a l'air de marcher. Ca s'invente pas :p .
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        5 août 2008 à 14:09:00

                                        Et alors le message d'erreur sans le constructeur de copie ca donne quoi ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                          5 août 2008 à 14:22:22

                                          La même chose. C'est le message sans le constructeur que j'ai donnée je crois. (ou alors je me suis trompé).

                                          C:\Users\Jr\Site web\Test C-C++\cell>make
                                          mingw32-make -f Makefile.Release
                                          mingw32-make[1]: Entering directory `C:/Users/Jr/Site web/Test C-C++/cell'
                                          g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
                                          -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS
                                          _QMAIN -I"c:\Qt\4.4.0\include\QtCore" -I"c:\Qt\4.4.0\include\QtCore" -I"c:\Qt\4.
                                          4.0\include\QtGui" -I"c:\Qt\4.4.0\include\QtGui" -I"c:\Qt\4.4.0\include" -I"." -
                                          I"c:\Qt\4.4.0\include\ActiveQt" -I"release" -I"." -I"c:\Qt\4.4.0\mkspecs\win32-g
                                          ++" -o release\cellule.o cellule.cpp
                                          g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
                                          -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS
                                          _QMAIN -I"c:\Qt\4.4.0\include\QtCore" -I"c:\Qt\4.4.0\include\QtCore" -I"c:\Qt\4.
                                          4.0\include\QtGui" -I"c:\Qt\4.4.0\include\QtGui" -I"c:\Qt\4.4.0\include" -I"." -
                                          I"c:\Qt\4.4.0\include\ActiveQt" -I"release" -I"." -I"c:\Qt\4.4.0\mkspecs\win32-g
                                          ++" -o release\FenPrincipale.o FenPrincipale.cpp
                                          FenPrincipale.cpp: In member function `void FenPrincipale::creerMenus()':
                                          FenPrincipale.cpp:48: warning: unused variable 'menuCellule'
                                          c:/Qt/4.4.0/include/QtGui/../../src/gui/widgets/qlabel.h: In copy constructor `C
                                          ellule::Cellule(const Cellule&)':
                                          C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_vec
                                          tor.h:207:   instantiated from `std::vector<_Tp, _Alloc>::vector(size_t) [with _
                                          Tp = Cellule, _Alloc = std::allocator<Cellule>]'
                                          FenPrincipale.cpp:5:   instantiated from here
                                          c:/Qt/4.4.0/include/QtGui/../../src/gui/widgets/qlabel.h:160: error: `QLabel::QL
                                          abel(const QLabel&)' is private
                                          C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_vec
                                          tor.h:207: error: within this context
                                          mingw32-make[1]: *** [release/FenPrincipale.o] Error 1
                                          mingw32-make[1]: Leaving directory `C:/Users/Jr/Site web/Test C-C++/cell'
                                          mingw32-make: *** [release] Error 2
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            5 août 2008 à 14:26:16

                                            hummm tu n'as pas enlevé le constructeur de copie... c:/Qt/4.4.0/include/QtGui/../../src/gui/widgets/qlabel.h:160: error: `QLabel::QL abel(const QLabel&)' is private
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              5 août 2008 à 14:30:43

                                              Si si je t'assure y'a vraiment plus rien c'est bizarre !
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 août 2008 à 14:32:32

                                                Ton erreur est seulement et uniquement dans le constructeur de copie de Cellule. Enlve-le et ça sera bon.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                  5 août 2008 à 14:35:21

                                                  Citation : Nanoc

                                                  Ton erreur est seulement et uniquement dans le constructeur de copie de Cellule. Enlve-le et ça sera bon.


                                                  Mais y'a pas de constructeur de copie et l'erreur existait avant que je n'écrive le constructeur de copie. Le constructeur de copie je l'ai écrit en attendant vos réponses. Et là il n'existe plus pourtant le compilateur parle de lui.

                                                  Je comprend pas.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    5 août 2008 à 14:41:01

                                                    Peut-être que ton erreur vient de là :
                                                    FenPrincipale::FenPrincipale(): tableauCellule(2)
                                                    


                                                    Essaie comme ça :
                                                    FenPrincipale::FenPrincipale(): tableauCellule(std::vector(2))
                                                    
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      5 août 2008 à 14:43:55

                                                      Bon après avoir remis tout comme c'était avant de commencer mes vector je vais reprendre tout au propre.

                                                      gymnopaul >> je vais essayer >> FenPrincipale.cpp:4: error: missing template arguments before '(' token

                                                      edit :

                                                      C:\Users\Jr\Site web\Test C-C++\cell>make
                                                      mingw32-make -f Makefile.Release
                                                      mingw32-make[1]: Entering directory `C:/Users/Jr/Site web/Test C-C++/cell'
                                                      g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
                                                      -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS
                                                      _QMAIN -I"c:\Qt\4.4.0\include\QtCore" -I"c:\Qt\4.4.0\include\QtCore" -I"c:\Qt\4.
                                                      4.0\include\QtGui" -I"c:\Qt\4.4.0\include\QtGui" -I"c:\Qt\4.4.0\include" -I"." -
                                                      I"c:\Qt\4.4.0\include\ActiveQt" -I"release" -I"." -I"c:\Qt\4.4.0\mkspecs\win32-g
                                                      ++" -o release\FenPrincipale.o FenPrincipale.cpp
                                                      FenPrincipale.cpp: In member function `void FenPrincipale::creerMenus()':
                                                      FenPrincipale.cpp:48: warning: unused variable 'menuCellule'
                                                      c:/Qt/4.4.0/include/QtGui/../../src/gui/widgets/qlabel.h: In copy constructor `C
                                                      ellule::Cellule(const Cellule&)':
                                                      C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_vec
                                                      tor.h:207:   instantiated from `std::vector<_Tp, _Alloc>::vector(size_t) [with _
                                                      Tp = Cellule, _Alloc = std::allocator<Cellule>]'
                                                      FenPrincipale.cpp:5:   instantiated from here
                                                      c:/Qt/4.4.0/include/QtGui/../../src/gui/widgets/qlabel.h:160: error: `QLabel::QL
                                                      abel(const QLabel&)' is private
                                                      C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_vec
                                                      tor.h:207: error: within this context
                                                      mingw32-make[1]: *** [release/FenPrincipale.o] Error 1
                                                      mingw32-make[1]: Leaving directory `C:/Users/Jr/Site web/Test C-C++/cell'
                                                      mingw32-make: *** [release] Error 2

                                                      Et là c'est sûr y'a pas de constructeur de copie.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        5 août 2008 à 15:02:56

                                                        Ok. L'erreur affichée n'est pas très claire mais la faute est simple:

                                                        Tu ne peux mettre dans un vector que des objets copiables.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                          5 août 2008 à 15:04:43

                                                          Ah oui j'ai oublié un truc :
                                                          FenPrincipale::FenPrincipale(): tableauCellule(std::vector<Cellule>(2)) 
                                                          // il manquait "<Cellule>"
                                                          

                                                          Voilà dit moi si ça marche cette fois !
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            5 août 2008 à 15:06:54

                                                            Citation : Nanoc

                                                            Ok. L'erreur affichée n'est pas très claire mais la faute est simple:

                                                            Tu ne peux mettre dans un vector que des objets copiables.


                                                            Arf... pas cool ca. Je suis dans la merde. Et donc il est pas copiable parce qu'il hérite d'un Qlabel c'est ca ?
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Anonyme
                                                              5 août 2008 à 15:15:41

                                                              Oui c'est ça. Il faut trouver autre chose. Tu disais tout à l'heure que c'était pour l'affichage, c'est bien ça? Alors pourquoi pas un QWigdet? (Je ne peux rien affirmer, je ne connais de loin pas assez Qt.)

                                                              @gymnopaul : ce que tu proposes n'est rien d'autre que l'utilisation du constructeur de copie.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              std::vector `tableau' undeclared

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown