Double héritage de classe template, quelques questions
Bonjour,
Je vous présente tout de suite un exemple de ce qui m'interpelle, je vous explique ensuite ce que j'ai du mal à comprendre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <iostream>
#include <istream>
#include <fstream>
using namespace std;
template <typename T>
class ObjectReader
{
public :
ObjectReader() {};
virtual ~ObjectReader() {};
virtual void readFrom(const istream& is) = 0;
};
template <typename T>
class ObjectFileReader : public ObjectReader<T>
{
public :
ObjectFileReader() : ObjectReader<T>() {};
using ObjectReader<T>::readFrom; // Requis
void readFrom(const string& filePath)
{
ifstream ifs(filePath.c_str());
readFrom(ifs);
ifs.close();
}
};
class StringReader : public ObjectFileReader<string>
{
public :
StringReader() : ObjectFileReader() {};
using ObjectFileReader::readFrom; // Requis
void readFrom(const istream& is) { cout << "StringReader::readFrom(const istream&)" << endl; }
};
int main()
{
StringReader temp;
temp.readFrom("main.cpp");
return 0;
} |
Avant tout autre chose, la classe StringReader est là pour l'exemple. Utiliser le type std::string me permet de ne pas avoir à ajouter la définition d'une nouvelle structure.
Si j'ai bien compris, les deux lignes requises (cf. commentaires de l'exemple), le sont pour s'assurer que l'on utilise pas une surcharge template de la classe parente qui ne définit pas les méthodes.
Donc première question : Est-ce bien la bonne raison ? ^^
Et oui, une heure tardive et pas trop l'habitude de la spécification des classes templates...
Si oui, existe-t-il un moyen plus pratique de parvenir au même résultat.
Effectivement, je n'ai qu'une méthode à chaque fois à ré-utiliser mais dans le cas où il y en aurais plus, ça deviens vite lourd à mettre en place non ?
Je suis aussi preneur pour tout commentaires, bien que sur un exemple minimaliste comme celui-là il ne doit pas y avoir grand chose à dire.
Merci d'avance.
[EDIT] Petite question supplémentaire :
Je crois avoir lu quelque part que la STL met en place le patron de conception RAII, est-ce vrai pour les flux ?
Si oui, je peux bien faire ce qui suit sans risque ?
Code:
void ObjectFileReader<T>::readFrom(const string& filePath) { readFrom(ifstream(filePath.c_str())); }