Les conditions pour instancier une classe patron par types class [Résolu]

Moi - 5 janv. 2015 à 19:15 - Dernière réponse :  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");
};
Afficher la suite 

Votre réponse

2 réponses

cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - Modifié par cptpingu le 6/01/2015 à 15:43
0
Merci
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
Commenter la réponse de cptpingu
0
Merci
Merciiiiiiii infiniment cptpingu
Commenter la réponse de Moi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.