Frage

Ich arbeite an einer Container-Klasse, die etwa wie folgt aussieht:

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;
    };
};

Und ein Iterator-Klasse, die wie folgt aussieht übereinstimmen:

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->();
};

Mein Problem ist, ... müssen beide Klassen in Bezug auf den anderen umgesetzt. Ich bin nicht sicher, wie der Behälter innerhalb des Iterators zu verweisen, zum Beispiel, weil, wenn der Iterator definiert ist, hat der Behälter noch nicht definiert.

Wie kann man das erreichen?

billy3

War es hilfreich?

Lösung

Weiterleiten deklarieren eine vor dem anderen. Sie können Verweise auf eine Vorwärts-deklarierten Klasse in der Erklärung einer anderen Klasse verwenden, so sollte dies funktionieren:

class hexFile; // forward

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

class hexFile {
   ...
};

Andere Tipps

Starten Sie Ihre .h Datei mit einer Forward-Referenz:

class hexFile;

dann mit der vollständigen Definition von class hexIterator folgen (die kompiliert werden, weil es eine braucht nur Zeiger hexFile), dann die volle deifnition von class hexFile (die jetzt nur noch übersetzt werden kann, weil bis dahin den Compiler weiß alles über hexIterator).

In der .cpp Datei, da Sie die .h natürlich enthalten, alles bekannt wird, und Sie können die Methoden in beliebiger Reihenfolge Sie möchten implementieren.

Ich würde empfehlen, die Definition aus der Erklärung der Klassen trennen. In der Header-Datei, erklären sie darauf, die Hexfile Klassen und dann von ihnen vollständig erklären beide in der Header-Datei. Sie können dann die einzelnen Klassen im einzelnen in der zugehörigen Quelldatei definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top