2009-06-18 7 views
1

Je travaille sur une classe de conteneur qui ressemble à ceci:C++ Container/Iterator Dépendance Problème

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 itérateur pour correspondre 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 ... les deux classes doivent être implémentées en termes de 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 pourrait-on accomplir cela?

Billy3

Répondre

5

Avant de déclarer l'un avant l'autre. Vous pouvez utiliser des références à ce qui devrait travailler classe déclarée en avant dans la déclaration d'une autre classe, donc:

class hexFile; // forward 

class hexIterator : ,,, { 
    ... 
}; 

class hexFile { 
    ... 
}; 
+0

Mis en ligne pour une réponse correcte, coche pour le plus rapide;) –

+0

vous savez, c'est drôle. Il y a longtemps, j'ai eu un problème similaire à celui-ci, et personne ne m'a dit que je pouvais transmettre une classe ... Je devais aimer, faire une autre classe, avec une fonction virtuelle pure, puis dériver les deux autres classes à partir de là, et utiliser le polymorphisme pour passer les pointeurs les uns des autres ... c'était un gâchis. –

3

Démarrez votre fichier .h avec une référence vers l'avant:

class hexFile; 

puis suivre avec la définition complète de class hexIterator (qui compilera car il n'a besoin que d'un pointeur à hexFile), puis la totalité deifnition de class hexFile (qui compilera très bien maintenant parce que par le compilateur sait tout sur hexIterator).

Dans le fichier .cpp, puisque vous incluez le .h bien sûr, tout sera connu et vous pouvez implémenter les méthodes dans l'ordre que vous souhaitez.

2

Je recommanderais de séparer la définition de la déclaration des classes. Dans le fichier d'en-tête, déclarez les classes hexFile et déclarez-les complètement dans le fichier d'en-tête. Vous pouvez ensuite définir les classes individuelles plus en détail dans le fichier source associé.