Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [c++] puntatori a classe derivate: problema con typeid

    dopo tanto penare ho circoscritto il problema del mio programmino, spero di essere chiaro nella spiegazione cosi' che possiate aiutarmi a risolverlo...e' sabato mattina e sono in ufficio a cercare di risolverlo da ore!

    Ho due classi che rappresentano due tipi diversi di lista:

    1. La classe NodeList ha un metodo add(char). Esso aggiunge alla lista un nodo che è espresso come istanza della classe Node
    2. La classe Graph è figlia di NodeList ed ha un metodo add(char, NodeList*). Esso aggiunge alla lista un nodo che è espresso come istanza della classe GraphNode, che è figlia di Node.

    Il principio è che un grafo è una lista di nodi, ma tali nodi sono dei nodi "arricchiti" (rispetto alla base Node) di un puntatore a NodeList, quindi un'intera lista di nodi, che rappresenta le adiacenze al nodo (i rami del grafo).

    Per come sono costruiti GraphNode e Node, cmq, essi sono linkati in entrambi i casi da un puntatore a Node. In questo modo se ho un oggetto Graph e su di esso chiamo il metodo add(char) (ereditato dal padre) verrà creato un oggetto di tipo Node e linkato alla lista tramite puntatore a Node. Se invece uso il metodo a due parametri, verrà creato un oggetto GraphNode, linkato cmq tramite puntatore a Node. Con riferimento ad un grafico, insomma, un nodo Node sarà un nodo senza rami uscenti ma solo rami entranti (o isolato) mentre un nodo GraphNode proterà con sé informazioni sulle sue adiacenze.

    PROBLEMA:
    Questo metodo NodeList::nextNode() restituisce un Node* al prossimo elemento della lista
    codice:
    Node* NodeList::nextNode(){
       return (current->next == 0) ? 0 : current = current->next;
    }
    (NodeList::current è un Node*; Node::next è un Node*)

    Ad essere restituito è, insomma, sempre un puntatore a Node, che però può puntare ad oggetti Node o ad oggetti GraphNode, a seconda di quale versione di add() è stata chiamata per crearli.

    come sonsigliatomi qui sul forum, all'esterno posso usare un loop e controllare il tipo di oggetti puntati mediante la funzione di libreria typeid.
    codice:
    while(Node* p = graph.nextNode())
    cout << endl << "Tipo di nodo: " << (typeid(p) == typeid(Node*)) ? "nodo semplice" : "nodo del grafo";
    ebbene, la condizione espressa dall'operatore ternario è sempre verificata! Eppure se Node* p dovesse puntare ad un GraphNode, la condizione non dovrebbe esserlo...giusto?

    dove sto sbagliando?
    Gabriele B. - http://9thcircle.it

  2. #2
    credo di aver risolto; il problema è che effettivamente avevo sbagliato ad usare typeid

    typeid non ti dice il tipo di oggetto a cui stai puntando, ma il tipo di oggetto che è il suo parametro...è giusto?

    sono arrivato alla conclusione perché questa condizione, nell'operatore ternario, effettivamente sembra funzionare

    codice:
    (typeid(*pNode) == typeid(GraphNode))
    Gabriele B. - http://9thcircle.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.