Partage
  • Partager sur Facebook
  • Partager sur Twitter

namespace et class

problème :(

Sujet résolu
    4 janvier 2008 à 15:28:07

    Bonjour,

    Je voudrais utiliser un namespace dans mon programme qui englobe les class et les fonctions, enfin tout quoi, un peu comme la lib standard ou SFML.

    quand je fais :

    1. namespace Hello
    2. {
    3.         class Salut
    4.         {
    5.         public:
    6.                 void menu ()
    7.                 {
    8.                         std::cout << "Salut !" << std::endl;
    9.                 }
    10.         };
    11. }


    bien entendu, ça compile ( et ça fonctione ^^ )

    mais quand je fais :

    1. namespace Hello
    2. {
    3.         class Salut
    4.         {
    5.         public:
    6.                 void menu ();
    7.         };
    8. }


    et que dans un autre fichier je fais :

    1. void Hello::Salut::menu()
    2. {
    3.         std::cout << "Salut !" << std::endl;
    4. }


    ça ne compile pas, le linker me sort des erreurs incomprehensible ...

    Je suppose qu'il y a une façons précise de se servir d'un namespace ?

    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      4 janvier 2008 à 15:39:54

      Je n'ai jamais utilisé les namespaces, je compte le faire bientôt, mais tu es sûr que ce n'est pas

      1. namespace Hello::void Salut::menu()
      2. {
      3.         std::cout << "Salut !" << std::endl;
      4. }


      C'est juste une suggestion j'ai jamais utilisé ! ;)
      • Partager sur Facebook
      • Partager sur Twitter
        4 janvier 2008 à 15:41:44

        non son code est juste a premiere vue, il nous faut les erreurs
        • Partager sur Facebook
        • Partager sur Twitter
          4 janvier 2008 à 15:47:16

          Citation : -Skypers-

          Je n'ai jamais utilisé les namespaces, je compte le faire bientôt, mais tu es sûr que ce n'est pas

          1. namespace Hello::void Salut::menu()
          2. {
          3.         std::cout << "Salut !" << std::endl;
          4. }



          C'est juste une suggestion j'ai jamais utilisé ! ;)



          ça ne marche pas non plus :( il me dit erreur de syntax.

          Citation : Chlab_lak

          non son code est juste a premiere vue, il nous faut les erreurs



          ok ...

          1>Linking...
          1>menu.obj : error LNK2005: "int __cdecl Acht::BoundingBox(class sf::Event,class sf::Sprite)" (?BoundingBox@Acht@@YAHVEvent@sf@@VSprite@3@@Z) already defined in MainEntryPoint.obj
          1>C:\Users\Adrien\Documents\Visual Studio 2008\Projects\sfml-dev-test\Debug\sfml-dev-test.exe : fatal error LNK1169: one or more multiply defined symbols found
          1>Build log was saved at "file://c:\Users\Adrien\Documents\Visual Studio 2008\Projects\sfml-dev-test\sfml-dev-test\Debug\BuildLog.htm"


          je suppose qu'avec ça il te faut le code ?

          1. namespace Acht
          2. {
          3.         int BoundingBox(sf::Event a, sf::Sprite b)
          4.         {
          5.                 if ((a.Mouse.X >= b.GetLeft() + b.GetWidth())
          6.                         || (a.Mouse.X  <= b.GetLeft())
          7.                         || (a.Mouse.Y >= b.GetTop() + b.GetHeight())
          8.                         || (a.Mouse.Y <= b.GetTop()))
          9.                 {
          10.                         return 0;
          11.                 }
          12.                 return 1;
          13.         }
          14.         class Menu
          15.         {
          16.         private:
          17.                 sf::Image m_image[3];
          18.                 sf::Sprite m_sprite[3];
          19.                 sf::Event Event;
          20.                 bool running;
          21.         public:
          22.                 Menu(sf::RenderWindow& ref)
          23.                 {
          24.                         m_image[0].LoadFromFile("data/menu.jpg");
          25.                         m_image[1].LoadFromFile("data/jouer.jpg");
          26.                         m_image[2].LoadFromFile("data/quitter.jpg");
          27.                         for (int i=0; i<=2; i++)
          28.                                 m_sprite[i].SetImage(m_image[i]);
          29.                         m_sprite[1].SetLeft(200.f);
          30.                         m_sprite[1].SetTop(160.f);
          31.                         m_sprite[2].SetLeft(700.f);
          32.                         m_sprite[2].SetTop(160.f);
          33.                         running = true;
          34.                         this->menu(ref);
          35.                 }
          36.                 void menu (sf::RenderWindow& );
          37.         };
          38. }


          et la définition :

          1. #include "namespace.hpp"
          2. void Acht::Menu::menu(sf::RenderWindow& screen)
          3. {
          4.         while (running)
          5.         {
          6.                 while (screen.GetEvent(Event))
          7.                 {
          8.                         switch (Event.Type)
          9.                         {
          10.                         case sf::Event::Close:
          11.                                 running = false;
          12.                                 break;
          13.                         case sf::Event::MouseButtonPressed:
          14.                                 switch (Event.Mouse.Buttons)
          15.                                 {
          16.                                 case sf::Mouse::Left:
          17.                                         if (Acht::BoundingBox(Event, m_sprite[1]))
          18.                                         {
          19.                                                 // jouer();
          20.                                         }
          21.                                         else if (Acht::BoundingBox(Event, m_sprite[2]))
          22.                                                 running = false;  
          23.                                         break;
          24.                                 }
          25.                                 break;
          26.                         default:
          27.                                 break;
          28.                         }
          29.                 }
          30.                 for (int i=0; i<=2; i++)
          31.                         screen.Draw(m_sprite[i]);
          32.                 screen.Display();
          33.         }
          34. }


          je le répète, si je définis la méthode menu directement dans la class, il n'y a aucun problème.
          • Partager sur Facebook
          • Partager sur Twitter
            4 janvier 2008 à 16:06:28

            essaye de changer le nom de ta fonction Acht::BoundingBox() (ex: Acht::Bounding_Box() )

            de plus j'ai un remarque sur ce code:
            1. int BoundingBox(sf::Event a, sf::Sprite b)
            2.         {
            3.                 if ((a.Mouse.X >= b.GetLeft() + b.GetWidth())
            4.                         || (a.Mouse.X  <= b.GetLeft())
            5.                         || (a.Mouse.Y >= b.GetTop() + b.GetHeight())
            6.                         || (a.Mouse.Y <= b.GetTop()))
            7.                 {
            8.                         return 0;
            9.                 }
            10.                 return 1;
            11.         }


            qui peut etre simplifier et modifier ( || -> && ) en:
            1. bool BoundingBox(const sf::Event &a, const sf::Sprite &b)
            2. {
            3.    return ((a.Mouse.X >= b.GetLeft() + b.GetWidth())
            4.            && (a.Mouse.X  <= b.GetLeft())
            5.            && (a.Mouse.Y >= b.GetTop() + b.GetHeight())
            6.            && (a.Mouse.Y <= b.GetTop()));
            7. }
            • Partager sur Facebook
            • Partager sur Twitter
              4 janvier 2008 à 16:11:06

              Citation : Chlab_lak

              essaye de changer le nom de ta fonction Acht::BoundingBox() (ex: Acht::Bounding_Box() )

              de plus j'ai un remarque sur ce code:

              1. int BoundingBox(sf::Event a, sf::Sprite b)
              2.         {
              3.                 if ((a.Mouse.X >= b.GetLeft() + b.GetWidth())
              4.                         || (a.Mouse.X  <= b.GetLeft())
              5.                         || (a.Mouse.Y >= b.GetTop() + b.GetHeight())
              6.                         || (a.Mouse.Y <= b.GetTop()))
              7.                 {
              8.                         return 0;
              9.                 }
              10.                 return 1;
              11.         }



              qui peut etre simplifier et modifier ( || -> && ) en:

              1. bool BoundingBox(const sf::Event &a, const sf::Sprite &b)
              2. {
              3.    return ((a.Mouse.X >= b.GetLeft() + b.GetWidth())
              4.            && (a.Mouse.X  <= b.GetLeft())
              5.            && (a.Mouse.Y >= b.GetTop() + b.GetHeight())
              6.            && (a.Mouse.Y <= b.GetTop()));
              7. }


              même erreur :

              1>Linking...
              1>menu.obj : error LNK2005: "int __cdecl Acht::Bounding_Box(class sf::Event,class sf::Sprite)" (?Bounding_Box@Acht@@YAHVEvent@sf@@VSprite@3@@Z) already defined in MainEntryPoint.obj
              1>C:\Users\Adrien\Documents\Visual Studio 2008\Projects\sfml-dev-test\Debug\sfml-dev-test.exe : fatal error LNK1169: one or more multiply defined symbols found


              j'ai pris note ta remarque concernant le BoundingBox merci :)
              • Partager sur Facebook
              • Partager sur Twitter
                4 janvier 2008 à 16:15:49

                ce que je comprends de l'erreur c'est que ta fonction existe deja dans MainEntryPoint.o (pas ta fonction mais sa signature/symbole -> càd -> ?Bounding_Box@Acht@@YAHVEvent@sf@@VSprite@3@@Z).

                essayes d'autre nom completement different
                • Partager sur Facebook
                • Partager sur Twitter
                  4 janvier 2008 à 16:26:17

                  BoundingBox doit soit être défini dans un .cpp, soit être déclarée inine si tu veux la garder entièrement dans l'en-tête.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 janvier 2008 à 16:31:00

                    je choisirais le .cpp.
                    mais pourquoi faut-il la mettre en inline si on la met dans le .hpp ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 janvier 2008 à 16:35:20

                      La solution est très simple:

                      TYPEDERETOUR NOMNAMESPACE::NOMCLASSE::NOMFONCTION(ARGUMENTS)
                      {

                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                        4 janvier 2008 à 16:39:50

                        Moi, j'ai toujours fait comme ceci :

                        MaClasse.h
                        1. #ifndef CLASSE_MACLASSE_H__
                        2. #define CLASSE_MACLASSE_H__
                        3. namespace MonEspace
                        4. {
                        5.     class MaClasse
                        6.     {
                        7.     public:
                        8.         bool MaMethode();
                        9.     }
                        10. }
                        11. #endif


                        MaClasse.cpp
                        1. #include "MaClasse.h"
                        2. namespace MonEspace
                        3. {
                        4.     bool MaClasse::MaMethode()
                        5.     {
                        6.         return true;
                        7.     }
                        8. }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 janvier 2008 à 16:41:22

                          Citation : Chlab_lak

                          mais pourquoi faut-il la mettre en inline si on la met dans le .hpp ?



                          je crois avoir trouvé la reponse -> Lien
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 janvier 2008 à 16:45:32

                            Citation : Laurent Gomila

                            BoundingBox doit soit être défini dans un .cpp, soit être déclarée inine si tu veux la garder entièrement dans l'en-tête.



                            merci à tous ça marche :) , j'ai déclaré BoundingBox dans un cpp, mais ça veut dire quoi "inline" ? ça change rien ?

                            Aussi en passant puisque tu es là, je n'arrive pas a récuperer les dernières source sur ton svn je dois pas etre très doué : http://sfml.svn.sourceforge.net/viewvc/sfml/

                            enfaite je dois récuperer les fichiers 1 à 1 mais c'est un peu fastidieux ...

                            il y a pas une méthode pour tout récuperer d'un coup ?

                            merci
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              4 janvier 2008 à 16:50:32

                              une foncion inline est une fonction qui ne va jamais être appelé mais son code va plutôt être copié-collé aux endroits où elle aurait dû être appelé si elle n'avait pas été inline.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 janvier 2008 à 16:54:55

                                enfaite c'est ton compilateur qui decide, quand tu mets inline ce n'est qu'une proposition
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 janvier 2008 à 19:23:09

                                  Citation


                                  <...> mais ça veut dire quoi "inline" ? <...>



                                  La fonction inline combine les avantages des fonctions ET des macros.
                                  + fonctions : Verification des paramètres par le compilateur
                                  + macros : Pas vraiment d'appel généré , c'est une sorte de traitement de texte .

                                  Il est intéressant de déclarer une méthode inline quand son code est court.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 janvier 2008 à 19:58:12

                                    ok merci à tous ;)

                                    topic résolu
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 janvier 2008 à 3:27:40

                                      Si une fonction définie dans un en-tête n'est pas inline, elle va se retrouver copiée dans chaque fichier qui inclue cet en-tête --> multiple définition (l'éditeur de liens va retrouver son implémentation à plusieurs endroits).

                                      Pour le SVN, il faut télécharger un client SVN (par exemple TortoiseSVN sous Windows) et faire un checkout du dépôt.

                                      C'est expliqué sur la page sourceforge.net du projet, rubrique SVN.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      namespace et class

                                      × 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