Pergunta

Todos os objetos no meu programa herdam de uma classe de contêineres. A classe de contêiner tem um virtual BaseNode* getParent() const; método e a virtual void setParent(BaseNode *p); método.

eu tenho um Set classe (definido em uma partida de tênis, não em uma estrutura de dados) que tenha o Match classe como é pai (via setParent()) mas desde Set herda de Container, O programa cria uma estrutura de árvore de cima para baixo e o Set A classe é criança, não precisa ter métodos para rastrear e manter informações sobre o pai além do que Container fornece.

O erro C++: invalid conversion from ‘BaseNode*’ to ‘Match*’ aparece no método abaixo quando tento compilar meu programa. (Player* getPlayer1() const; só existe no Match classe)

Player* Set::getPlayer1() const{
    return getParent()->getPlayer1();
}

Esta é a minha estrutura de herança para a partida. (Observe que TreeNode é um modelo)

Match -> TreeNode<Set> -> BaseNode -> Container

Não entendo por que estou recebendo um erro de conversa. Eu tentei ler meu livro, mas é uma referência bastante ruim. O Google apenas forneceu muita informação irrelevante.

Editar

Player* Set::getPlayer1() const{
    return dynamic_cast<Match>(getParent())->getPlayer1();
}

causas

error: cannot dynamic_cast ‘#‘obj_type_ref’ not supported by dump_expr#<expression error>((&((const Set*)this)->Set::<anonymous>))’ (of type ‘class BaseNode*’) to type ‘class Match’ (target is not pointer or reference)

Editar 2

Acabei de perceber que preciso dynamic_cast<Match*> que funciona.

Foi útil?

Solução

O problema é que getParent() retorna a BaseNode*, que pode ser um ponteiro para qualquer tipo de BaseNode - pode apontar para uma classe não relacionada que também deriva de BaseNode. Se você tem 100% de certeza de que o pai deve ser do tipo Match, você deve lançar o pai para um Match* Primeiro, e então você pode ligar getPlayer() naquilo:

Player* Set::getPlayer1() const{
    return dynamic_cast<Match*>(getParent())->getPlayer1();
}

Se o pai não for necessário um Match, então dynamic_cast Pode retornar nulo, por isso não se esqueça de verificar isso.

Outras dicas

Eu acho que você realmente precisa reorganizar sua hierarquia e nomes de métodos ... isso não tem nada a ver com sua pergunta, mas em geral parece difícil entender por que definir herda da partida. (Uma partida não tem conjuntos?)

Os jogos são compostos de pontos, os conjuntos são compostos de jogos e uma partida é composta por sets ... Um ponto é ganho por um jogador.

Você provavelmente deve estruturá -lo mais de perto no mundo real.

Apenas meu $ 0,02

EDITAR

Eu provavelmente teria um objeto de correspondência que contém um mapa de conjuntos (mapa, isto é, um, dois três, etc.) e o método player (int) em vez de player1 () e player2 (). Além disso, não parece necessário ter um método para o jogador na classe set. Um conjunto apontaria para uma partida em que está sendo jogada.

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