Pergunta

Eu estou trabalhando em uma classe de recipiente que é algo como isto:

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

E uma classe de iterador para coincidir com que se parece com isso:

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

O meu problema é ... ambas as classes precisam implementado em termos do outro. Não estou certo como fazer referência o recipiente dentro do iterador, por exemplo, porque quando o iterador é definido, o recipiente ainda não foi definido.

Como pode um fazer isso?

Billy3

Foi útil?

Solução

declarar um

Encaminhar antes do outro. Você pode usar referências a uma classe frente declarado na declaração de outra classe, por isso deve funcionar:

class hexFile; // forward

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

class hexFile {
   ...
};

Outras dicas

Comece o seu arquivo .h com uma referência para a frente:

class hexFile;

então seguir com a definição completa de class hexIterator (que irá compilar porque ele só precisa de um ponteiro para hexFile), então o deifnition cheio de class hexFile (que irá compilar muito bem agora, porque até então o compilador sabe tudo sobre hexIterator).

No arquivo .cpp, desde que você incluir o .h é claro, tudo será conhecido e você pode implementar os métodos em qualquer ordem que desejar.

Eu recomendaria que separa a definição da declaração das classes. No arquivo de cabeçalho, para frente declarar as classes hexFile e, em seguida, declarar totalmente ambos no cabeçalho do arquivo. Você pode então definir as classes individuais em mais detalhes no arquivo de origem associada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top