Partage
  • Partager sur Facebook
  • Partager sur Twitter

Templates de classe

    2 juin 2008 à 13:15:10

    Bonjour, je souhaiterais avoir un peu d'aide concernant une classe template que je veux créer. Il s'agit d'une classe qui permet de manipuler des coordonnées. J'aurais pu utiliser un struct, mais j'ai besoin d'utiliser certaines fonctions (équation de droite reliant les deux points, distance entre ces deux points,...) donc j'utilise une classe. J'essaie donc de compiler ceci :

    Coordonnees.h
    #ifndef DEF_COORDONNEES
    #define DEF_COORDONNEES
    
        template <typename T> class Coordonnees
        {
            public :
    
            Coordonnees<T> ();
            Coordonnees<T> (T x, T y);
            Coordonnees<T> (const Coordonnees<T> &coord);
            T& x();
            T& y();
            Coordonnees operator+(const Coordonnees<T> &coordonnees);
            Coordonnees operator+=(const Coordonnees<T> &coordonnees);
            Coordonnees operator*(double value);
            double distance(const Coordonnees<T> &coordonnees);
            double equation(const Coordonnees<T> &coordonnees);
    
            protected :
    
            T m_x;
            T m_y;
    
        };
    #endif
    


    Coordonnees.cpp
    #include "Coordonnees.h"
    #include "constantes.h"
    
    template <typename T>
    Coordonnees<T>::Coordonnees<T>()
    {
        m_x = 0;
        m_y = 0;
    }
    Coordonnees<T>::Coordonnees<T>(T x, T y)
    {
        m_x = x;
        m_y = y;
    }
    Coordonnees<T>::Coordonnees<T>(const Coordonnees<T> &coord)
    {
        this->m_x = coord.m_x;
        this->m_y = coord.m_y;
    }
    T& Coordonnees<T>::x()
    {
        return m_x;
    }
    T& Coordonnees<T>::y()
    {
        return m_y;
    }
    Coordonnees<T> operator+(const Coordonnees<T> &coordonnees)
    {
        Coordonnees<T> new_pos;
        new_pos.m_x += this->m_x + coordonnees.m_x;
        new_pos.m_y += this->m_y + coordonnees.m_y;
    
        return new_pos;
    }
    Coordonnees operator+=(const Coordonnees<T> &coordonnees)
    {
        m_x += coordonnees.m_x;
        m_y += coordonnees.m_y
        return (*this);
    }
    double distance(const Coordonnees &coordonnees)
    {
        return sqrt(carre(this->m_x - coordonnees.m_x) + carre(this->m_y - coordonnees.m_y));
    }
    double equation(const Coordonnees &coordonnees)
    {
        return ((this->m_y - coordonnees.m_y) / (this->m_x - coordonnees.m_x));
    }
    Coordonnees operator*(double value)
    {
        Coordonnes nouv;
    
        nouv.m_x = value*this->m_x;
        nouv.m_y = value*this->m_y;
    
        return nouv;
    }
    


    constantes.h
    #ifndef DEF_CONSTANTES
    #define DEF_CONSTANTES
    
    #include <SFML/System.hpp>
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include <cmath>
    
    #define CONSTANTE_GRAVITATION 9.81
    
    inline double carre(double nombre)
    {
        return nombre*nombre;
    }
    
    double polynome(double a, double b, double c, bool positif)
    {
        switch(positif)
        {
            case true:
                return ((-b+sqrt(carre(b) - 4*a*c))/(2*a));
                break;
            case false:
                return ((-b-sqrt(carre(b) - 4*a*c))/(2*a));
                break;
        };
        if(positif != true && positif != false)
         return 0;
    }
    void polynome(double a, double b, double c, double x[2])
    {
        x[0] = ((-b+sqrt(carre(b) - 4*a*c))/(2*a));
        x[1] = ((-b-sqrt(carre(b) - 4*a*c))/(2*a));
    }
    
    
    
    #endif
    


    Voici l'erreur retournée par code::blocks :
    F:\Data\C++\Pendule\constantes.h||In function `double polynome(double, double, double, bool)':|
    F:\Data\C++\Pendule\constantes.h|29|warning: control reaches end of non-void function|
    F:\Data\C++\Pendule\Coordonnees.cpp|10|error: `T' was not declared in this scope|
    F:\Data\C++\Pendule\Coordonnees.cpp|10|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|10|error: `T' was not declared in this scope|
    F:\Data\C++\Pendule\Coordonnees.cpp|10|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|10|error: expected `,' or `;' before '(' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|15|error: `T' was not declared in this scope|
    F:\Data\C++\Pendule\Coordonnees.cpp|15|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|15|error: `T' was not declared in this scope|
    F:\Data\C++\Pendule\Coordonnees.cpp|15|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|15|error: expected `,' or `;' before '(' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|20|error: expected constructor, destructor, or type conversion before '&' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|20|error: expected `,' or `;' before '&' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|24|error: expected constructor, destructor, or type conversion before '&' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|24|error: expected `,' or `;' before '&' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|28|error: `T' was not declared in this scope|
    F:\Data\C++\Pendule\Coordonnees.cpp|28|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|28|error: `T' was not declared in this scope|
    F:\Data\C++\Pendule\Coordonnees.cpp|28|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|29|error: ISO C++ forbids declaration of `operator+' with no type|
    F:\Data\C++\Pendule\Coordonnees.cpp|29|error: ISO C++ forbids declaration of `coordonnees' with no type|
    F:\Data\C++\Pendule\Coordonnees.cpp|29|error: `int operator+(const int&)' must have an argument of class or enumerated type|
    F:\Data\C++\Pendule\Coordonnees.cpp||In function `int operator+(const int&)':|
    F:\Data\C++\Pendule\Coordonnees.cpp|30|error: `T' undeclared (first use this function)|
    F:\Data\C++\Pendule\Coordonnees.cpp|30|error: (Each undeclared identifier is reported only once for each function it appears in.)|
    F:\Data\C++\Pendule\Coordonnees.cpp|30|error: template argument 1 is invalid|
    F:\Data\C++\Pendule\Coordonnees.cpp|30|error: invalid type in declaration before ';' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|31|error: `m_x' has not been declared|
    F:\Data\C++\Pendule\Coordonnees.cpp|31|error: request for member of non-aggregate type before '+=' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|31|error: invalid use of `this' in non-member function|
    F:\Data\C++\Pendule\Coordonnees.cpp|31|error: `m_x' has not been declared|
    F:\Data\C++\Pendule\Coordonnees.cpp|31|error: request for member of non-aggregate type before ';' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|32|error: `m_y' has not been declared|
    F:\Data\C++\Pendule\Coordonnees.cpp|32|error: request for member of non-aggregate type before '+=' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|32|error: invalid use of `this' in non-member function|
    F:\Data\C++\Pendule\Coordonnees.cpp|32|error: `m_y' has not been declared|
    F:\Data\C++\Pendule\Coordonnees.cpp|32|error: request for member of non-aggregate type before ';' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|36|error: expected constructor, destructor, or type conversion before "operator"|
    F:\Data\C++\Pendule\Coordonnees.cpp|36|error: expected `,' or `;' before "operator"|
    F:\Data\C++\Pendule\Coordonnees.cpp|42|error: expected `,' or `...' before '&' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|43|error: ISO C++ forbids declaration of `Coordonnees' with no type|
    F:\Data\C++\Pendule\Coordonnees.cpp||In function `double distance(int)':|
    F:\Data\C++\Pendule\Coordonnees.cpp|44|error: invalid use of `this' in non-member function|
    F:\Data\C++\Pendule\Coordonnees.cpp|44|error: `coordonnees' undeclared (first use this function)|
    F:\Data\C++\Pendule\Coordonnees.cpp|44|error: invalid use of `this' in non-member function|
    F:\Data\C++\Pendule\Coordonnees.cpp|46|error: expected `,' or `...' before '&' token|
    F:\Data\C++\Pendule\Coordonnees.cpp|47|error: ISO C++ forbids declaration of `Coordonnees' with no type|
    F:\Data\C++\Pendule\Coordonnees.cpp||In function `double equation(int)':|
    F:\Data\C++\Pendule\Coordonnees.cpp|48|error: invalid use of `this' in non-member function|
    F:\Data\C++\Pendule\Coordonnees.cpp|48|error: `coordonnees' undeclared (first use this function)|
    F:\Data\C++\Pendule\Coordonnees.cpp|48|error: invalid use of `this' in non-member function|
    F:\Data\C++\Pendule\Coordonnees.cpp|50|error: expected constructor, destructor, or type conversion before "operator"|
    F:\Data\C++\Pendule\Coordonnees.cpp|50|error: expected `,' or `;' before "operator"|
    ||=== Build finished: 49 errors, 1 warnings ===|
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      2 juin 2008 à 13:27:06

      Salut,

      Je t'invite à lire ceci pour l'utilisation des template avec les classes : http://cpp.developpez.com/faq/cpp/?pag [...] reation_class
      Ca permettra d'élager un peu ce que te dis code::block. :)

      Tu devrais également sortir les opérateur + et * de ta classe et en faire des fonctions libres.
      • Partager sur Facebook
      • Partager sur Twitter
        2 juin 2008 à 13:41:44

        Accessoirement,
        - class == struct (à la visibilité par défaut près)
        - Vu l'accès complet non protégé que tu donnes à tes deux membres, autant les passer en public et faire sauter les accesseurs qui n'encapsulent rien du tout.
        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          2 juin 2008 à 15:42:48

          if( positif != true && positif != false )
          


          o_O ?

          • Partager sur Facebook
          • Partager sur Twitter
            2 juin 2008 à 16:01:41

            Merci pour vos conseils.

            MatteX -> Il me réclamait absolument un retour pour la fonction mais je vais mettre un default:

            EDIT : Si j'ai bien compris, je dois mettre mon fichier Coordonnees.cpp en .tpp ?
            • Partager sur Facebook
            • Partager sur Twitter
              2 juin 2008 à 16:02:51

              je sais alors enlève le if et met le return 0.0 à la fin... ou lance une exception si la fonction ne peut se terminer normalement.

              [EDIT]en fait, tant qu'à faire un switch sur un booléen :
              double polynome(double a, double b, double c, bool positif)
              {
                  if( positif )
                      return ((-b+sqrt(carre(b)-4*a*c))/(2*a));
                  else
                      return ((-b-sqrt(carre(b)-4*a*c))/(2*a));
              }
              



              [/EDIT]
              • Partager sur Facebook
              • Partager sur Twitter
                2 juin 2008 à 16:31:21

                Par contre je ne vois vraiment pas comment me débrouiller avec les templates. C::B n'accepte pas l'extension .tpp
                • Partager sur Facebook
                • Partager sur Twitter
                  2 juin 2008 à 16:58:47

                  Mets tout dans le .h, ou dans un .inl, ou configure C::B (ne pas me demander comment, ni même si c'est possible)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                  Templates de classe

                  × 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