[C++]

[C++] - C++ - Programmation

Marsh Posté le 30-01-2005 à 21:37:25    

Bonjour,
 
j'ai un probleme de conception objet.
J'ai modelisé une sorte de systeme de fichiers (je dis une sorte car ca represente le systeme de fichier d'une carte à puce).
Ca se presente de la façon suivante : une classe CardData qui contient 1 ou plusieurs fichiers indexés par un numero. Chaque fichier contient 1 a n enregistrements et chaque enregistrement contient un buffer d'octets.
A chaque octet ou groupe d'octets j'attribue un "tag", par exemple dans le fichier 0x17, l'enregistrement numero 1 avec un offset de 3 et une taille  de 10 je stocke une string.
 
Voici la classe  

Code :
  1. /******************************************************
  2. *  Class CDataIndex : stocke les informations qui   *
  3. *  seront associées a une clé de type chaine    *
  4. *  Ex : on associe a "nom" le fichier 0x17, le record 1*
  5. *  l'offset 10 et la taille de 25       *
  6. ******************************************************/
  7. class CDataIndex
  8. {
  9. public :
  10. int m_nSFID; // FileID
  11. int m_nRecNo; // RecNo
  12. int m_nOffset;  // Offset
  13. int m_nSize; // DataLen
  14. int m_nType;    // Type : Numeric or String
  15.   CDataIndex()  {  }
  16.   CDataIndex(int nSFID, int nRecNo, int nOffset, int nSize, int nType) { 
  17.   m_nSFID = nSFID;
  18.   m_nRecNo = nRecNo;
  19.   m_nOffset     = nOffset;
  20.   m_nSize = nSize;
  21.   m_nType = nType; //String
  22.   }
  23. };
  24. /******************************************************
  25. * Class CCardRecord : Modelise un enregistrment
  26. *  
  27. ******************************************************/
  28. class CCardRecord
  29. {
  30. public :
  31. int  m_nRecNo;       // Numero du record
  32. int  m_nRecLen;      // Taille du record
  33. vector<BYTE> m_ByteArray;    // Donnees du record
  34. BOOL         m_bNeedUpdate; // Donnees ont ete modififiees
  35. CCardRecord() {};
  36. CCardRecord( int nRecNo, int nRecLen )
  37. {
  38.  m_nRecNo  = nRecNo;
  39.  m_nRecLen = nRecLen;
  40.  m_ByteArray.resize( nRecLen );
  41.  m_bNeedUpdate = FALSE;
  42. }
  43. int GetRecNo()  { return m_nRecNo; }
  44. int GetRecLen() { return m_nRecLen; }
  45. void GetRecData(int nOffset, int nDataSize, CString& csValue);
  46. void GetRecData(int nOffset, int nDataSize, WORD& nValue);
  47. };
  48. /******************************************************
  49. * Class CCardRecord : Modelise un fichier
  50. *  
  51. ******************************************************/
  52. class CCardFile
  53. {
  54. public :
  55. int m_nSFID;        // FileID
  56. BOOL m_bNeedUpdate; // Donnees ont ete modififiees
  57. map<int, CCardRecord> m_RecIndex; //Records indexés par leurs numeros
  58. CCardFile() {}
  59. CCardFile( int nSFID )
  60. {
  61.  m_nSFID = nSFID;
  62.  m_bNeedUpdate = FALSE;
  63. }
  64. };
  65. /*************************************************************
  66. * Class CCardData : Modelise les donnees d'une carte  
  67. * Un CardData contient 1 a n fichiers (CCardFile)
  68. * et chaque fichier contient 1 à m records (CCardRecord)
  69. *  
  70. **************************************************************/
  71. class CCardData
  72. {
  73. public:
  74. CCardData();
  75. virtual ~CCardData();
  76. BOOL   LoadCardMapping();
  77. BOOL   ReadMappingFile(CXMLReader &xml);
  78. void   XMLCardFile(CXMLReader &xml);
  79. void   XMLCardRecord( CXMLReader &xml );
  80. void   XMLCardData( CXMLReader &xml );
  81. int    ReadCard();
  82. WORD   GetNumeric(CString csKey);
  83. const CString         GetString(CString csKey);
  84. BOOL   GetData(CString csKey, WORD& nValue);
  85. BOOL   GetData(CString csKey, CString& szValue);
  86. void   Dump( );
  87. CString   m_csTag;
  88. int   m_nSFID;
  89. int   m_nRecNo;
  90. int   m_nRecSize;
  91. int   m_nDataOffset;
  92. int   m_nDataType;
  93. int   m_nDataSize;
  94. CString   m_csName;
  95. CString   m_csSerialNum;
  96. ULONG   m_ulSerialNum;
  97. // Associe une tag avec un num. de fichier, record, index,...
  98. map<CString, CDataIndex> m_tagIndex;
  99. // File collection index by Short File Id (SFID)
  100. map<int,  CCardFile>  m_FileIndex;
  101. //CDataIndex m_Test;
  102. };

 
 
Le probleme est le suivant : j'aimerais acceder a une donnee en specifiant juste sont tag.
 
PAr exemple j'aimerais faire un truc du style
 
CCardData card;
 
// nom pointe vers une donnee de type chaine
if (card.m_tagIndex["nom"].GetData() == "vincent" )
;
 
ou encore  
// age pointe vers une donnee numerique (par ex int)
if (card.m_tagIndex["age"].GetData() == 10)  
;
 
mais malheureusement ce n'est pas possible de faire ca je pense
car une fonction ne peut pas avoir la meme signature avec seulement  
le type de retour qui change.
Donc pour resumer j'ai besoin de quelque chose a qui je passe une chaine  
et qui me renvoit la donnee(soit une chaine soit un nombre).
 
Dans CardIndex j'associe a une chaine le numero de fichiers, le numero de record, la taille, l'offset et le type.
Si vous avez reussi a comprendre un tiers de ce que je viens d'ecrire auriez vous une idéee sur comment faire.
 
 
 
 

Reply

Marsh Posté le 30-01-2005 à 21:37:25   

Reply

Marsh Posté le 30-01-2005 à 21:43:18    

if (card.m_tagIndex["nom"].GetData() == "vincent" )
;
 
ou encore  
// age pointe vers une donnee numerique (par ex int)
if (card.m_tagIndex["age"].GetData() == 10)  
 
 
 
 
 
là tu fous tout le typage en l'air. Fais du polymorphisme (à coup de dynamic_cast), voir même utilise le Design Pattern Visitor.

Reply

Marsh Posté le 31-01-2005 à 11:23:15    

Taz a écrit :

if (card.m_tagIndex["nom"].GetData() == "vincent" )
;
 
ou encore  
// age pointe vers une donnee numerique (par ex int)
if (card.m_tagIndex["age"].GetData() == 10)  
 
 
 
 
 
là tu fous tout le typage en l'air. Fais du polymorphisme (à coup de dynamic_cast), voir même utilise le Design Pattern Visitor.


 
t'aurais un exemple ou un lien ?

Reply

Marsh Posté le 31-01-2005 à 11:33:08    

voir le topic C++
 
ce qu'il faut, c'est que chaque test te permettent de déterminer le type (ou type parent) de ta 'card' pour pouvoir en fait quelque chose.
 
voir aussi boost::any

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed