Проблема зависимости контейнера/итератора C++

Я работаю над контейнерным классом, который выглядит примерно так:

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

И соответствующий класс итератора выглядит так:

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

Моя проблема в том, что оба класса должны быть реализованы с точки зрения другого. Например, я не уверен, как ссылаться на контейнер внутри итератора, потому что, когда итератор определен, контейнер еще не определен.

Как это можно сделать?

Билли3


person Billy ONeal    schedule 18.06.2009    source источник


Ответы (3)


Вперед объявить один перед другим. Вы можете использовать ссылки на предварительно объявленный класс в объявлении другого класса, так что это должно работать:

class hexFile; // forward

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

class hexFile {
   ...
};
person sth    schedule 18.06.2009
comment
Проголосовал за правильный ответ, поставил галочку за самый быстрый ;) - person Billy ONeal; 19.06.2009
comment
знаете, это забавно. Давным-давно у меня была проблема, подобная этой, и никто не сказал мне, что я могу объявить класс вперед... Мне нужно было сделать какой-то другой класс с чистой виртуальной функцией, а затем вывести оба других класса. из него и использовать полиморфизм для передачи указателей друг на друга... это был беспорядок. - person Carson Myers; 19.06.2009

Начните файл .h с прямой ссылки:

class hexFile;

затем следует полное определение class hexIterator (которое будет скомпилировано, потому что ему нужен только указатель на hexFile), затем полное определение class hexFile (которое теперь скомпилируется просто отлично, потому что к тому времени компилятор уже знает все о hexIterator).

В файле .cpp, поскольку вы включили .h, конечно, все будет известно, и вы можете реализовать методы в любом порядке.

person Alex Martelli    schedule 18.06.2009

Я бы рекомендовал отделить определение от объявления классов. В файле заголовка сначала объявите классы hexFile, а затем полностью объявите их оба в файле заголовка. Затем вы можете более подробно определить отдельные классы в соответствующем исходном файле.

person Joe Corkery    schedule 18.06.2009