Estou tentando aprender C ++, então me perdoe se esta pergunta demonstrar falta de conhecimento básico, veja bem, o fato é que eu tenho falta de conhecimento básico.
Quero ajuda para descobrir como criar um iterador para uma classe que criei.
Eu tenho uma classe 'Shape' que possui um contêiner de Points. Eu tenho uma classe 'Piece' que faz referência a uma Shape e define uma posição para a Shape. A peça não tem uma forma, apenas faz referência a uma forma.
Quero que pareça que Piece é um contêiner de pontos que são iguais aos da Shape que ele faz referência, mas com o deslocamento da posição da Piece adicionado.
Quero ser capaz de percorrer os Pontos da Peça, como se a Peça fosse um contêiner. Eu li um pouco e não encontrei nada que me ajudou. Ficaria muito grato por qualquer indicação.
Respostas:
Você deve usar o Boost.Iterators. Ele contém vários modelos e conceitos para implementar novos iteradores e adaptadores para iteradores existentes. Eu escrevi um artigo sobre esse mesmo tópico ; está na revista ACCU de dezembro de 2008. Ele discute uma solução elegante (IMO) para exatamente o seu problema: expor coleções de membros de um objeto, usando Boost.Iterators.
Se você deseja usar apenas o stl, o livro Josuttis possui um capítulo sobre a implementação de seus próprios iteradores STL.
fonte
/ EDIT: Entendo, um iterador próprio é realmente necessário aqui (eu li a pergunta primeiro). Ainda assim, estou deixando o código abaixo, pois pode ser útil em circunstâncias semelhantes.
Um iterador próprio é realmente necessário aqui? Talvez seja suficiente encaminhar todas as definições necessárias para o contêiner que contém os pontos reais:
Isso pressupõe que você esteja usando um
vector
internamente, mas o tipo pode ser facilmente adaptado.fonte
auto begin() -> decltype(m_shape.container.begin()) { return m_shape.container.begin(); }
Aqui, projetar um STL como contêiner personalizado é um excelente artigo que explica alguns dos conceitos básicos de como uma classe de contêineres como STL pode ser projetada juntamente com a classe iteradora. O iterador reverso (um pouco mais difícil) é deixado como um exercício :-)
HTH,
fonte
Você pode ler este artigo do ddj
Basicamente, herde do std :: iterator para realizar a maior parte do trabalho para você.
fonte
std::iterator
está marcado como obsoleto no C ++ 17.Escrever iteradores personalizados em C ++ pode ser bastante detalhado e complexo de entender.
Como não consegui encontrar uma maneira mínima de escrever um iterador personalizado, escrevi esse cabeçalho de modelo que pode ajudar. Por exemplo, para tornar a
Piece
classe iterável:Então você seria capaz de usá-lo como um Contêiner STL normal:
Também permite adicionar outros tipos de iteradores como
const_iterator
oureverse_const_iterator
.Espero que ajude.
fonte
A solução para o seu problema não é a criação de seus próprios iteradores, mas o uso de contêineres e iteradores STL existentes. Armazene os pontos em cada forma em um recipiente como vetor.
O que você faz a partir de então depende do seu design. A melhor abordagem é iterar através dos pontos nos métodos dentro do Shape.
Se você precisar acessar pontos fora do Shape (isso pode ser uma marca de um design deficiente), poderá criar nos métodos Shape que retornarão as funções de acesso do iterador para os pontos (nesse caso, também crie um typedef público para o contêiner de pontos). Veja a resposta de Konrad Rudolph para obter detalhes dessa abordagem.
fonte