C ++: conversione non valida da & # 8216; BaseNode * & # 8217; a & # 8216; Corrispondenza * & # 8217;
-
19-08-2019 - |
Domanda
Tutti gli oggetti nel mio programma ereditano da una classe Container. La classe Container ha un metodo Virtual BaseNode * getParent () const;
e un virtual void setParent (BaseNode * p);
.
Ho una classe Set
(impostata in una partita di tennis, non una struttura di dati) che ha la classe Match
come padre (tramite setParent ()
) ma poiché Set
eredita da Container
, il programma crea una struttura ad albero dall'alto in basso e la classe Set
è una figlia , non è necessario disporre di metodi per tenere traccia e mantenere le informazioni relative al suo genitore oltre a quanto fornito da Container
.
Errore C ++: conversione non valida da & # 8216; BaseNode * & # 8217; a & # 8216; Corrispondenza * & # 8217;
viene visualizzato nel metodo seguente quando provo a compilare il mio programma. ( Player * getPlayer1 () const;
esiste solo nella classe Match
)
Player* Set::getPlayer1() const{
return getParent()->getPlayer1();
}
Questa è la mia struttura ereditaria per Match. (Nota che TreeNode
è un modello)
Match -> TreeNode<Set> -> BaseNode -> Container
Non capisco perché ricevo un errore di conversazione. Ho provato a leggere il mio libro di testo ma è un riferimento piuttosto scadente. Google ha appena fornito troppe informazioni irrilevanti.
Modifica
Player* Set::getPlayer1() const{
return dynamic_cast<Match>(getParent())->getPlayer1();
}
cause
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)
Modifica 2
Ho appena realizzato che ho bisogno di dynamic_cast < Match * >
che funziona.
Soluzione
Il problema è che getParent ()
restituisce un BaseNode *
, che potrebbe essere un puntatore a qualsiasi tipo di BaseNode
- potrebbe puntare a una classe non correlata che deriva anche da BaseNode
. Se sei sicuro al 100% che il genitore deve essere di tipo Match
, dovresti prima trasmettere il genitore a Match *
, quindi puoi chiamare getPlayer ()
su questo:
Player* Set::getPlayer1() const{
return dynamic_cast<Match*>(getParent())->getPlayer1();
}
Se il genitore non è necessario un Match
, dynamic_cast
potrebbe restituire NULL, quindi assicurati di controllarlo.
Altri suggerimenti
Penso che tu abbia davvero bisogno di riorganizzare la tua gerarchia e i nomi dei metodi ... Questo non ha nulla a che fare con la tua domanda, ma in generale sembra difficile capire perché Set eredita da Match. (una partita non ha set?)
i giochi sono composti da punti, i set sono composti da giochi e una partita è composta da set ... un punto viene vinto da un giocatore.
probabilmente dovresti strutturarlo più vicino al mondo reale.
solo i miei $ .02
Modifica
Probabilmente avrei un oggetto Match che contiene una mappa di set (mappa cioè set uno, due tre, ecc.) e il Metodo Player (int) anziché Player1 () e player2 (). Inoltre non sembra necessario avere un metodo per il giocatore nella classe Set. Un set indica una partita in cui viene giocato.