Problème de dépendance de conteneur / itérateur C ++
-
06-07-2019 - |
Question
Je travaille sur une classe de conteneur qui ressemble à ceci:
class hexFile {
public:
HANDLE theFile;
unsigned __int64 fileLength;
hexFile(const std::wstring& fileName)
{
theFile = CreateFile(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
if (theFile == INVALID_HANDLE_VALUE);
{
throw std::runtime_error(eAsciiMsg("Could not open file!"));
}
BY_HANDLE_FILE_INFORMATION sizeFinder;
GetFileInformationByHandle(theFile, &sizeFinder);
fileLength = sizeFinder.nFileSizeHigh;
fileLength <<= 32;
fileLength += sizeFinder.nFileSizeLow;
};
~hexFile()
{
CloseHandle(theFile);
};
hexIterator begin()
{
hexIterator theIterator(this, true);
return theIterator;
};
hexIterator end()
{
hexIterator theIterator(this, false);
return theIterator;
};
};
Et une classe d'itérateur à comparer qui ressemble à ceci:
class hexIterator : public std::iterator<std::bidirectional_iterator_tag, wchar_t>
{
hexFile *parent;
public:
bool highCharacter;
__int64 filePosition;
hexIterator(hexFile* file, bool begin);
hexIterator(const hexIterator& toCopy);
~hexIterator();
hexIterator& operator++()
{
return ++this;
}
hexIterator& operator++(hexIterator& toPlus);
hexIterator& operator--()
{
return --this;
}
hexIterator& operator--(hexIterator& toMinus);
hexIterator& operator=(const hexIterator& toCopy);
bool operator==(const hexIterator& toCompare) const;
bool operator!=(const hexIterator& toCompare) const;
wchar_t& operator*();
wchar_t* operator->();
};
Mon problème est que ... les deux classes doivent être implémentées par rapport à l'autre. Je ne sais pas comment référencer le conteneur à l'intérieur de l'itérateur, par exemple, car lorsque l'itérateur est défini, le conteneur n'a pas encore été défini.
Comment peut-on y arriver?
Billy3
La solution
Avant de déclarer l'un avant l'autre. Vous pouvez utiliser des références à une classe déclarée en aval dans la déclaration d'une autre classe. Cela devrait donc fonctionner:
class hexFile; // forward
class hexIterator : ,,, {
...
};
class hexFile {
...
};
Autres conseils
Démarrez votre fichier .h
avec une référence de transfert:
class hexFile;
suivez ensuite la définition complète de class hexIterator
(qui sera compilé car il ne nécessite qu'un pointeur vers hexFile
), définition de class hexFile
(qui compilera très bien maintenant car à ce moment-là, le compilateur sait tout sur hexIterator
).
Dans le fichier .cpp
, puisque vous incluez le .h
, tout sera connu et vous pourrez implémenter les méthodes dans l'ordre de votre choix.
Je recommanderais de séparer la définition de la déclaration des classes. Dans le fichier d'en-tête, transmettez en avant les classes hexFile, puis déclarez-les intégralement dans le fichier d'en-tête. Vous pouvez ensuite définir les classes individuelles plus en détail dans le fichier source associé.