Проблема зависимости контейнера / итератора C ++ - PullRequest
1 голос
/ 19 июня 2009

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

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

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

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

Billy3

Ответы [ 3 ]

5 голосов
/ 19 июня 2009

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

class hexFile; // forward

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

class hexFile {
   ...
};
3 голосов
/ 19 июня 2009

Запустите файл .h с прямой ссылкой:

class hexFile;

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

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

2 голосов
/ 19 июня 2009

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

...