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

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top