Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1496 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++]

n°966361
romeo9423
Posté le 30-01-2005 à 21:37:25  profilanswer
 

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.
 
 
 
 

mood
Publicité
Posté le 30-01-2005 à 21:37:25  profilanswer
 

n°966368
Taz
bisounours-codeur
Posté le 30-01-2005 à 21:43:18  profilanswer
 

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.

n°966585
romeo9423
Posté le 31-01-2005 à 11:23:15  profilanswer
 

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 ?

n°966602
Taz
bisounours-codeur
Posté le 31-01-2005 à 11:33:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++]

 

Sujets relatifs
Plus de sujets relatifs à : [C++]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR