romeo9423 | 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 :
- /******************************************************
- * Class CDataIndex : stocke les informations qui *
- * seront associées a une clé de type chaine *
- * Ex : on associe a "nom" le fichier 0x17, le record 1*
- * l'offset 10 et la taille de 25 *
- ******************************************************/
- class CDataIndex
- {
- public :
- int m_nSFID; // FileID
- int m_nRecNo; // RecNo
- int m_nOffset; // Offset
- int m_nSize; // DataLen
- int m_nType; // Type : Numeric or String
- CDataIndex() { }
- CDataIndex(int nSFID, int nRecNo, int nOffset, int nSize, int nType) {
- m_nSFID = nSFID;
- m_nRecNo = nRecNo;
- m_nOffset = nOffset;
- m_nSize = nSize;
- m_nType = nType; //String
- }
- };
- /******************************************************
- * Class CCardRecord : Modelise un enregistrment
- *
- ******************************************************/
- class CCardRecord
- {
- public :
- int m_nRecNo; // Numero du record
- int m_nRecLen; // Taille du record
- vector<BYTE> m_ByteArray; // Donnees du record
- BOOL m_bNeedUpdate; // Donnees ont ete modififiees
- CCardRecord() {};
- CCardRecord( int nRecNo, int nRecLen )
- {
- m_nRecNo = nRecNo;
- m_nRecLen = nRecLen;
- m_ByteArray.resize( nRecLen );
- m_bNeedUpdate = FALSE;
- }
- int GetRecNo() { return m_nRecNo; }
- int GetRecLen() { return m_nRecLen; }
- void GetRecData(int nOffset, int nDataSize, CString& csValue);
- void GetRecData(int nOffset, int nDataSize, WORD& nValue);
- };
- /******************************************************
- * Class CCardRecord : Modelise un fichier
- *
- ******************************************************/
- class CCardFile
- {
- public :
- int m_nSFID; // FileID
- BOOL m_bNeedUpdate; // Donnees ont ete modififiees
- map<int, CCardRecord> m_RecIndex; //Records indexés par leurs numeros
- CCardFile() {}
- CCardFile( int nSFID )
- {
- m_nSFID = nSFID;
- m_bNeedUpdate = FALSE;
- }
- };
- /*************************************************************
- * Class CCardData : Modelise les donnees d'une carte
- * Un CardData contient 1 a n fichiers (CCardFile)
- * et chaque fichier contient 1 à m records (CCardRecord)
- *
- **************************************************************/
- class CCardData
- {
- public:
- CCardData();
- virtual ~CCardData();
- BOOL LoadCardMapping();
- BOOL ReadMappingFile(CXMLReader &xml);
- void XMLCardFile(CXMLReader &xml);
- void XMLCardRecord( CXMLReader &xml );
- void XMLCardData( CXMLReader &xml );
- int ReadCard();
- WORD GetNumeric(CString csKey);
- const CString GetString(CString csKey);
- BOOL GetData(CString csKey, WORD& nValue);
- BOOL GetData(CString csKey, CString& szValue);
- void Dump( );
- CString m_csTag;
- int m_nSFID;
- int m_nRecNo;
- int m_nRecSize;
- int m_nDataOffset;
- int m_nDataType;
- int m_nDataSize;
- CString m_csName;
- CString m_csSerialNum;
- ULONG m_ulSerialNum;
- // Associe une tag avec un num. de fichier, record, index,...
- map<CString, CDataIndex> m_tagIndex;
- // File collection index by Short File Id (SFID)
- map<int, CCardFile> m_FileIndex;
- //CDataIndex m_Test;
- };
|
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.
|