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

StackOverflow https://stackoverflow.com/questions/1015276

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

class hexFile; // forward

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

class hexFile {
   ...
};

Другие советы

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

class hexFile;

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top