Newsgroup: it.comp.lang.c++
Titolo: Perché usare ancora i puntatori?

moltissimi linguaggi appena nati (Java, C#, 
VB.NET
, ecc.) non
supportano i puntatori (oltre ad altre belle cose, come l'ereditarietà
multipla, i template, ecc. VEDI ALTRO POST).
In effetti a pensarci bene i puntatori non servono più a molto, una
volta inserito il concetto di riferimento... perché si continua dunque
ad utilizzarli nel C++?
]\/[ad]\/[age
"Un Maestro nell'arte della vita, non fa nessuna precisa distinzione tra lavoro
e gioco, fatica e riposo, mente e corpo, educazione e ricreazione. 
Insegue semplicemente la sua visione di Eccellenza attraverso qualunque cosa sta facendo e lascia agli altri decidere se sta lavorando o giocando. A lui sembra sempre che sta facendo entrambe le cose." - Anonimo.
.-~-.-~-. 
www.madmagelab.cjb.net
 .-~-.-~-.

ad utilizzarli nel C++?
I vecchi programmi in C++ non sarebbero + compilabili e inoltre i
riferimenti così come sono intesi in c++ non possono sostituire
completamente i puntatori.
-- 
Marco Barisione (ICQ 84277092)
Su it.news.gruppi si sta discutendo della creazione di it.comp.lang
dove si parlerà dei linguaggi senza un proprio newsgroup e dei
confronti fra i diversi linguaggi.
Se sei interessato unisciti alla discussione.

completamente i puntatori.
ok per la compatibilità, quali sono le situazioni in cui i puntatori
non possono sostituire i riferimenti?
grazie.. :-D


 non possono sostituire i riferimenti?
Ad esempio quando non puoi inizializzarli subito e devi cambiare di volta in
volta l'oggetto puntato. A me e` capitato di recente di fare un programma in
cui, per un semplice fatto di ottimizzazione, si doveva tenere traccia di un
oggetto che poteva cambiare in maniera dinamica e allora un puntatore si e`
rivelato la cosa migliore. In java avrei dovuto escogitare qualche trucco
per "simulare" una specie di puntatore ma a questo punto tanto vale
lasciarli ed usarli con cognizione di causa.
Ciao
  Roberto.
--
"Ci sono persone che guardano il mondo e si chiedono perche`. Ce ne sono
altre che guardano il mondo sognando come dovrebbe essere e si chiedono
perche` no."
(R. Kennedy)
ICQ#: 18469567
http://crsoft.8m.com

 ad utilizzarli nel C++?
Veramente Java usa *solo* puntatori per i tipi complessi, solo che li
maschera. In questo modo fare le cose semplici risulta piu' semplice,
mentre fare le cose complicate risulta piu' complicato se non
impossibile.
Ciao,
Nicola


Supponi di avere la seguente funzione:
AnObject& getAnObject(const std::string& aName)
{
    //cervo l'oggetto nella mia struttura dati
    //con il nome specificato e lo torno
}
che succede se non viene trovato l'oggetto in questione ?
Se invece tornassi un puntatore sarebbe piu' semplice
(torneresti 0).
Nota che nel primo caso le soluzioni sarebbero due
(io ho pensato solo a queste)
1) Tornare un oggetto "Dummy" riconoscibile dal chiamante
2) Tirare un'eccezione.
Ciao
Gaetano.
-- 
Posted from 
dell-01.mm.eutelsat.org
 [194.214.173.17] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 non possono sostituire i riferimenti?
penso che il senso della frase fosse "quali sono le situazioni in cui i 
reference non possono sostituire i puntatori?". Cmq:
struct node_of_binary_tree {
  int data;
  node_of_binary_tree *r, *l;
};
Se vuoi farlo sembrare un po' piu' C++ cambia "struct" in "class", 
incapsula un po' qua e la' e fornisci gli opportuni metodi; pero' resta il 
fatto che devi sempre utilizzare i puntatori; in generale, essi sono 
indispensabili in tutti i casi in cui la locazione puntata puo' variare, al 
contrario di quel che accade con i reference (che sono dei semplici alias 
ad altri nomi).
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

impossibile.
Cosa intendi esattamente come più complicato? Non conosco Java ma in
Python il fatto che tutto sia una specie di puntatore rende tutto
molto semplice.


 molto semplice.
Mi accodo. Conosco poco Java e so che le cose diventano più complicate.
Ma non mi pare che questo sia dovuto al fatto che tutte le variabili di
tipi complessi siano di fatto dei puntatori. Anzi, ho sempre ritenuto la
cosa una semplificazione. Per esempio Smalltalk è un linguaggio
semplicissimo da imparare (leggermente meno da usare) e in Smalltalk
tutte le variabili sono puntatori tranne quelle che contengono interi
corti e quelle che contengono un carattere. E comunque la cosa è del
tutto trasperente dato che anche questi due tipi si comportano
esattamente come tutti gli altri (al contrario di quello che avviene in
C++ e in Java).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

cosa una semplificazione.
Infatti in Python tutto è una specie di puntatore (senza asimmetrie
fra tipi built-in e classi definite dall'utente) ma mi sembra che
questo semplifichi le cose notevolmente, a parte la solita domanda da
newbie:
a = 3
b = [1, 2, 3]
def foo(i, l):
    x = 5
    b[1] = 42
foo(a, b)
#perché a è 3 e b è [1, 42, 3]?


};
forse sto dicendo un'enorme cavolata... ma non potrei scrivere
class BinaryTreeNode {
	int Data;
	BinaryTreeNode &RightChild, &LeftChild;
};
uhm... è una cavolata, vero?


uhm... è una cavolata, vero?
Sì se intendi i reference come sono intesi in C++ perché quello che
vuoi fare tu non è possibile.
Cos'hanno i puntatori che non vanno? Una volta che li hai capiti non
sono così difficili.


ad utilizzarli nel C++?
Ci sono diverse situazioni che rendono i puntatori indispensabili
nella programmazione in c++, penso ad esempio al polimorfismo ed
all'importanza che i puntatori assumono in casi come questo.
Penso al caso(piuttosto frequente) in cui una classe deve
necessariamente poter comunicare con istanze di altre classi ed alla
scomodità(e perdita di prestazioni) che ci sarebbe se non fosse
possibile "collegare" le due istanze tramite un puntatore e poter
cambiare in qualsiasi momento l'istanza a cui esso punta.
I reference non sono stati pensati per sostituire i puntatori , tant'é
che rispetto ad essi presentano delle differenze e pure delle
limitazioni(ad esempio non é possibile assegnare un reference ad
un'altro oggetto o variabile dopo averlo inizializzato la prima volta,
ma questo lo dovrebbero sapere tutti).
Il Ghenio
-----
These are my parting words to you:
those who give up are doomed!
-----

 C++ e in Java).
Anch'io non e' che sia un esperto di Java, e sicuramente l'aver nascosto
i puntatori e' un problema in se' relativamente limitato. Pero' per
esempio concorre a rendere falso il concetto che in Java non si abbiano
memory leak: non essendo immediata la *necessita'* di liberare
esplicitamente i puntatori (assegnando Null), non esistendo i
distruttori deterministici, non esistendo le callback, e' comune passare
istanze a librerie che se ne impadronscono e non le rilasciano piu'. Di
fatto per fare le cose come si deve *bisogna* gestire la memoria non
avendo gli strumenti e soprattutto non avendone l'esperienza.
Ciao,
Nicola

 uhm... è una cavolata, vero?
Supponi che sei su una foglia, cosa dovrebbero contenere RightChild e
LeftChild?


sono così difficili.
ah, beh, a me piacciono i puntatori, era una domanda generica...
sinceramente l'unica cosa che non mi piace dei puntatori è l'operatore
->, che considero più fastidioso del semplice .
ma credo sia una motivazione futile... :-DDD


 #perché a è 3 e b è [1, 42, 3]?
Domanda da gruppo Python. Ma anche senza conoscerlo direi che a è stato
inizializzato a 3 e mai più cambiato mentre b è stato inizializzato a
[1,2,3] e poi il secondo elemento lo cambi nella seconda riga di foo in
un 42!
Non conosco Python ma all'interno di foo, mi aspetto che:
a è accedibile come globale
b è accedibile come globale
i è un alias locale di a
l è un alias locale di b
x non dichiarata è una locale


 uhm... č una cavolata, vero?
Puoi farlo. Ma RigthChild e LeftChild li devi "bindare" a un
BinaryTreeNode quando costruisci un'istanza (nel costruttore che hai
omesso). E una volta costruiti non puoi piů cambiare il binding.
Dubito che la cosa possa essere utile!


[...]
Molti non capiscono perché in Python b cambia e a no, e *pensano* che
sia un asimmetria di python fra tipi semplici come gli interi che
sembrano passati per valore e fra tipi più complessi che vengono
passati per riferimento. Quello che volevo dire è che in realtà
superato questo apparente problema la gestione delle variabili di
python diventa molto semplice ed intuitiva anche per un newbie.


 wrote in message
news:3bcc0752...@News.CIS.DFN.DE...

Ok. Non lo sapevo. Ma non vedo la difficoltà. Fatto salvo il sapere con
certezza quali sono i tipi demplici e quali sono i tipi più complessi
(suppongo tutti tranne i tipi semplici).


(suppongo tutti tranne i tipi semplici).
No il problema è che una variabile è come un etichetta attaccata ad un
dato in memoria, se fai
a = 5
a = 3
semplicemente stacchi l'etichetta chiamata a dall'oggetto 5 e la metti
sull'oggetto 3, se hai una lista e fai:
a = [1, 2, 3]
a[1] = 42
semplicemente modifichi l'oggetto [1, 2, 3] ma non sposti l'etichetta,
se fai invece
a = [1, 2, 3]
a = [5, 4, 16]
si comporta esattamente come un intero e l'etichetta a è ora
sull'altro oggetto.
Ma questo è OT e mi serviva solo per dire che in python anche se tutto
è una specie di puntatore non si hanno grandi problemi.


 sull'oggetto 3, se hai una lista e fai:
....
Lo avevo capito. Praticamente è la stessa cosa che avviene in Smalltalk.
Resta il fatto che bisogna sapere quali sono i tipi che si comportano in
questa maniera e quali no.
