Classe Template et fonction virtuelle cachée
Bonjour,
J'ai codé une classe template permettant d'accéder à une table de base de données.
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
template <class T>
class IDbfIO
{
public:
/// \brief Ecrit un enregistrement (non impl)
virtual writeRecord( const T & data )
{
}
/// \brief Modifie un enregistrement (non impl)
virtual void editRecord( const T & data )
{
}
/// \brief Lit un enregistrement (non impl)
virtual void readCurrentRecord( T & data )
{
}
/// \brief Lit tous les enregistrements dans un vecteur
virtual void readAllRecords( vector<T> & aData )
{
int i = 0;
aData.resize( m_pTable->RecordCount );
m_pTable->First();
// lecture du fichier
while ( !m_pTable->Eof )
{
readCurrentRecord( aData.at( i ) );
i++;
m_pTable->Next();
}
}
/// \brief Lit tous les enregistrements dans une map
virtual void readAllRecords( map<AnsiString,T> & mapData )
{
AnsiString strKey = "";
T data;
m_pTable->First();
// lecture du fichier
while ( !m_pTable->Eof )
{
readCurrentRecord( strKey, data );
if( !mapData.count( strKey ) )
{
mapData[strKey] = data;
}
else
{
//log
}
m_pTable->Next();
}
}
}; |
Cette architecture a un double intérêt :
- me permettre de factoriser du code ( par exemple : les fonctions lisant l'intégralité de la table ).
- forcer les classes filles implémentant IDbfIO a surcharger des fonctions (par exemple : readCurrentRecord() ).
Par exemple voici une classe fille :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
class CDbfService : public IDbfIO<CDataService>
{
public:
CDbfService();
~CDbfService();
/// \brief Specialisation de lecture pour les CDataService
/// \param data : donnees du service
void readCurrentRecord( CDataService & data );
}; |
Elle supplante readCurrentRecord(). Jusque là pas de soucis, c'est lorsqu'elle supplante readAllRecords( vector<CDataService> & aData ) que j'ai un soucis.
En effet, j'ai une warning me précisant que la fonction readAllRecords( map<AnsiString,T> & mapData ) est cachée.
J'ai donc creusé le sujet et compris qu'il fallait que je rajoute la ligne
Code:
using CDbfIO::readAllRecords( map<AnsiString,T> & mapData );
dans la classe fille pour que la fonction virtuelle ne soit plus cachée.
Néanmoins le compilateur de C++ builder 2010 me jette lorsque j'ajoute cette ligne de code. Sachant que j'ai également essayé d'ajouter :
Code:
using CDbfIO<T>::readAllRecords( map<AnsiString,T> & mapData );
et
Code:
using CDbfIO<CDataService>::readAllRecords( map<AnsiString,CDataService> & mapData );
Pensez-vous que c'est une erreur syntaxe de ma part ou une limitation du compilateur de C++ builder 2010 ?
A noter que pour l'instant je m'en suis tiré en déclarant, dans IDbfIO, les fonctions :
Code:
1 2 3
|
virtual void readAllRecordsInVector( vector<T> & aData )
virtual void readAllRecordsInMap( map<AnsiString,T> & mapData ) |
au lieu de
Code:
1 2 3
|
virtual void readAllRecords( vector<T> & aData )
virtual void readAllRecords( map<AnsiString,T> & mapData ) |
Mais je trouve cette solution lourde car elle m'oblige à créer une nouvelle fonction pour chaque type de conteneur alors que je voulais juste surchargé la fonction readAllRecords().
Merci d'avance !