Bonjour,
J'ai codé une classe template permettant d'accéder à une table de base de données.
Cette architecture a un double intérêt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } };
- 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 :
Elle supplante readCurrentRecord(). Jusque là pas de soucis, c'est lorsqu'elle supplante readAllRecords( vector<CDataService> & aData ) que j'ai un soucis.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ); };
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
dans la classe fille pour que la fonction virtuelle ne soit plus cachée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part using CDbfIO::readAllRecords( map<AnsiString,T> & mapData );
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 :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part using CDbfIO<T>::readAllRecords( map<AnsiString,T> & mapData );
Pensez-vous que c'est une erreur syntaxe de ma part ou une limitation du compilateur de C++ builder 2010 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part using CDbfIO<CDataService>::readAllRecords( map<AnsiString,CDataService> & mapData );
A noter que pour l'instant je m'en suis tiré en déclarant, dans IDbfIO, les fonctions :
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 virtual void readAllRecordsInVector( vector<T> & aData ) virtual void readAllRecordsInMap( 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().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 virtual void readAllRecords( vector<T> & aData ) virtual void readAllRecords( map<AnsiString,T> & mapData )
Merci d'avance !
Partager