C ++: conversione non valida da & # 8216; BaseNode * & # 8217; a & # 8216; Corrispondenza * & # 8217;

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

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top