View Single Post
Old 12-12-2013, 00:11   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
Ciao,
stavo facendo esercizi presi da un corso che usa il C come linguaggio. Ad un certo punto c'era
Codice:
typedef struct Elem { int x; int y; struct Elem *next; } Punto;
typedef Punto * Linea;
E ho riscritto il secondo typedef (inglesizzando il tutto) come
Codice:
using Line = Node<Point>*;
Hai omesso le tue definizioni (e lo using sopra... che vuol dire ?) per cui devo rispondere a sentimento.

Quote:
dove Node è un template tipo Elem, tipico nodo di lista singly linked.

Poi mi sono reso conto che non posso usare Line come faccio invece usando esplicitamente Node; cioè non posso fare così:
Codice:
Node<int>* list = new Node<int>{ 2 };
infatti, il seguente codice non compila:
Codice:
Line line = new Line{ Point{ 0, 2 } };
poichè new Line ritorna un Node<Point>**...
Devo fare
Codice:
Line line = new Node<Point>{ Point{ 0, 2 } };
L'errore e' che il nuovo typedef dovrebbe essere piu' correttamente
Codice:
typedef Node<Point> Line;
senza il puntatore, perche' una linea e' una lista di punti, non un puntatore ad una lista di punti.

Quote:
Cose ovvie eccetera. Il punto è: l'alias Line torna utile come tipo di parametri di funzioni, ad esempio
Codice:
double length(Line l); // anzichè double length(Node<Point>* l);
però c'è questo apparente mismatch nella dichiarazione di un nuovo oggetto Line, creato per forza con new Node<Point> anzichè new Line. C'è un modo di risolvere? So già che la risposta è no, però mi sembra che mi sfugga qualcosa... scusate la sega mentale!
Se identifichi Line con Node<Point> (senza puntatore) le cose sembrano piu' ragionevoli.
Dovrai usare
Codice:
double length(Line* l)
ma ha senzo perche' la notazione senza * dava l'impressione che copiassi la lista quando la passavi come argomento, cosa che in realta' non e' vera.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso