Les conditions pour instancier une classe patron par types class

Résolu
Moi - 5 janv. 2015 à 19:15
 Moi - 6 janv. 2015 à 23:21
Bonjour,
Svp ,pourriez vous m'aider pour résoudre la deuxième partie de l'exercice suivant :
Énoncé:
a.Créer un patron de classes nommé pointcol, tel que chaque classe instanciée permette
de manipuler des points colorés (deux coordonnées et une couleur) pour lesquels on puisse choisir à la fois le type des coordonnées et celui de la couleur. On se limitera à deux
fonctions membre : un constructeur possédant trois arguments (sans valeur par défaut) et
une fonction affiche affichant les coordonnées et la couleur d'un « point coloré ».

b.Dans quelles conditions peut-on instancier une classe patron pointcol pour des paramètres de type classe ?
voila la réponce de la première partie:

#include <iostream>
using namespace std ;
template <class T, class U> class pointcol
{
T x, y ; // coordonnees
U coul ; // couleur
public :
pointcol (T abs, T ord, U cl)
{ x = abs ; y = ord ; coul = cl ;
}
void affiche ()
{ cout << "point colore - coordonnees " << x << " " << y
<< " couleur " << coul << endl ;
}
} ;
main()
{ pointcol <int, short int > p1 (5, 5, 2) ; p1.affiche () ;
pointcol <float, int> p2 (4, 6, 2) ; p2.affiche () ;
pointcol <double, unsigned short> p3 (1, 5, 2) ; p3.affiche () ;
system("pause");
};

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 6/01/2015 à 15:43
Bonjour.

A) Mis au propre de ton code et explications:
#include <iostream>

template <class T, class U>
class PointCol
{
public :
  PointCol(T x, T y, U col)
    : _x(x), _y(y), _col(col)
  {
  }

  void affiche(std::ostream& out) const
  {
    out << "Point colore - coordonnees ("
        << _x << "," << _y
        << ") couleur = " << _col << endl ;
  }

private:
  T _x;
  T _y;
  U _col;
};


int main()
{
  PointCol<int, short int> p1(5, 5, 2);
  p1.affiche(std::cout);
  PointCol<float, int> p2(4, 6, 2);
  p2.affiche(std::cout);
  PointCol<double, unsigned short> p3(1, 5, 2);
  p3.affiche(std::cout);

  return 0;
}


- Évite les using namespace, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Préfère l'utilisation d'une liste d'initialisation, plutôt que d'initialiser tes attributs dans le corps du constructeur.
- Si une méthode ne modifie pas les attributs de sa classe, on la marque comme const.
- La fonction "affiche" devrait prendre en argument le flux ou écrire, plutôt que d'écrire dans std::cout.
- La fonction main() retourne toujours un entier.
- Il n'y a pas de ";" après l'accolade d'une fonction.

B) Ce que l'on veut dire par là, c'est que si tu instancies un template avec une classe, cette classe doit être compatible avec ton patron. C'est-à-dire que cette classe doit avoir les méthodes qui seront utilisées par ton patron. Dans ce cas précis, il te faut une classe qui gère l'affichage via un flux.

Exemple:
struct MaClasse
{
  void print(std::ostream& out) const
  {
    out << i;
  }

  int _i;
};

std::ostream& operator<<(std::ostream& out, const MaClasse& ma_classe)
{
  ma_classe.print(out);
  return out;
}

int main()
{
  MaClasse ma_classe;
  ma_classe._i = 45;
  PointCol<int, MaClasse> p1(5, 5, ma_classe);
  p1.affiche(std::cout);

  return 0;
}




Améliorer votre expérience CodeS-SourceS avec ce plugin:
ttp://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0