Newsgroup: it.comp.lang.c++
Titolo: Oggetto: parte base ed estensione dinamica

Sto leggendo un libro (Savy, Da C++ a UML) e a un certo punto inizia a 
parlare di una parte base e di una estensione dinamica dell'oggetto.
La cosa non mi è chiara (anche perché il libro non è chiaro). A un certo 
punto dice che il compilatore alloca la parte base o nello stack o 
nell'heap.
Come può un compilatore allocare nell'heap??
Potreste consigliarmi qualche link che spieghi (bene) questa differenza 
fra parte base e parte dinamica?
Grazie

parlare di una parte base e di una estensione dinamica dell'oggetto.
Uh?!... "parte base" e "estensione dinamica"? L'oggetto, almeno che io
sappia, è un monolite, allocato o tutto sullo stack o tutto sull'heap.
Bisognerebbe vedere a cosa si riferisce esattamente il libro.
Curiosità: lo stai leggendo in lingua originale o in italiano? (perché
a fare brutti scherzi a volte sono le traduzioni stesse).

 sappia, è un monolite, allocato o tutto sullo stack o tutto sull'heap.
Allora c'è scritto:
"...ciascun oggetto della classe è costituito da una parte base, 
allocata, per effetto della definizione dell'oggetto nel programm 
utente, così come sono allocate le variabili dei tipi standard (cioè in 
area stack, in area dati statici o in area heap) e un'estensione da 
allocare in area heap...".
"...la funzione distruttore ha il compito di deallocare l'eventuale 
estensione dell'oggetto, allo scopo di garantire una corretta 
deallocazione delle variabili in area heap. L'allocazione e la 
deallocazione della parte base di un oggetto avvengono, viceversa, sulla 
base dei normali meccanismi previsti dal linguaggio per le variabili 
ordinarie, in area dati statici, stack o heap".
"...nel caso in cui l'oggetto non abbia un'estensione dinamica, non 
occorre definire la funzione distruttore, mentre la funzione costruttore 
è comunque necessaria per l'assegnazione dei valori iniziali 
all'oggetto. In assenza della funzione costruttore ha luogo 
un'inizializzazione di default...".
Grazie

 Allora c'è scritto:
scusa errori ortografia, ho una scheggia in un occhio che me 
la levano luned'
cma, manco io ho mai visto la dicitura parte base, ma si 
potrebbe pensare che si riferisca o al puntatore o alla 
reference in cui viene alla fin fine memorizzato sempre un 
indirizzo (quello dinamico che punta al corpo vero e proprio 
dell'oggetto, sullo heap di default, se usi new senza 
direttive specifiche).
es se scrivi
classPinkoPallino * ptrIstanza = new classPinkoPallino;
lo spazio per il puntatore è nella memoria automatica (o 
statica se lo richiedo),
il reference o puntatore serve per agganciare l'indirizzo 
ritornato da new ad un qualche oggetto "noto", chiamabile 
per nome, laddove invece i blocchi nello heap sono entità 
anonime che non possono essere riferite direttamente. Serve 
un nome dichiarato per rendere usabile un blocco allocato 
dello heap (e anche per associare il tipo congruo a quel 
pezzo di ram riservata).
In realtà questo discorso funge solo per le allocazioni 
dinamiche di tipo NON-Array. Per questi ultimi sullo stack 
allochi solo il nome collettivo, ma ogni singolo oggetto non 
ha più associato una propria singola "parte base" (per usare 
la tua denominazione). Quindi in proporzione un array 
dinamico usa poca memoria stack (un solo puntatore per tutte 
le istanze). Cmq anche li quel benedetto puntatore deve pur 
essere memorizzato da qualche parte in oggetti conosciuti 
per nome nello scope opportuno
SPero che ti torni ora
ciao
SOviet.Maerio


occorre definire la funzione distruttore
Sciocchezza. Vedi sopra. Il distruttore non ha senso solo in caso di
allocazione dinamica. La funzione del distruttore non è solo quella di
rilasciare la memoria dinamica allocata, ma in generale di rilasciare
TUTTE le risorse acquisite dall'applicazione (tipicamente in fase di
costruzione). Se in costruzione apro un file, in distruzione lo
chiudo; se in costruzione avvio una connessione a un db, in
distruzione la chiudo; e così via...

le istanze).
?? cioè ?? fammi un esempio...

Ciao,
Carlo Savy è stato mio docente all'università ... molto valido secondo me .
Detto questo il libro lo conosco molto bene, se mi dici il capitolo ci do 
una occhiata
che magari fuori contesto può sembrare poco chiaro !
Bye.
"nembo kid" <nembo@kid> ha scritto nel messaggio 
news:48672f89$0$40165$4faf...@reader1.news.tin.it...


 ?? cioè ?? fammi un esempio...
idem (spero)
ciao
Soviet

a PtrPippo) è solo uno per tutti e 100
Non esiste un "oggetto base". Forse sarebbe il caso di cominciare a
usare i termini giusti, in un contesto in cui "oggetto", "classe" (e
persino "base") hanno significati ben definiti. In questo caso si
parla di "puntatore" e il puntatore PtrPippo è ovviamente allocato
sullo stack (essendo una variabile come tutte le altre). La memoria
cui la variabile puntatore punta è allocata sullo heap.

 allocare in area heap...".
Mi pare che non si riferisca agli oggetti del C++, ma a particolari tipi 
di oggetti che per qualche motivo ti vuole insegnare a costruire. Dalla 
descrizione sembra che intenda:
class Estensione;
class Base {
	private:
		Estensione *estensione;
	public:
	/*....*/
		Base()
			: estensione(new Estensione)
		{
		}
		~Base() {
			delete estensione;
		}
};
// E.

 distruzione la chiudo; e così via...
Secondo me quello che intende l'autore come "estensione dinamica" è 
esattamente tutto l'insieme di risorse dinamiche acquisite dall'oggetto 
(memoria, handle, files, ...) che devono quindi essere rilasciate nel 
distruttore.
In pratica sta insegnando l'idioma RAII
Se la leggi così allora la frase incriminata funziona.
E funziona anche la similitudine con "parte base" e "estensione 
dinamica" a patto di trovare un qualche termine più opportuno per "parte 
base" (tipo "oggetto vero e proprio")
GM

 se mi dici il capitolo
Allora i par./pagg. sono:
§ 16.3, p. 222
§ 16.3.2, p. 223
§ 16.4, p. 224
Grazie

 "estensione". 
Ad ogni modo l'ho abbandonato questo libro.
Sto seguendo ora il Deitel e il Thinking...
Grazie a tutti.

esattamente tutto l'insieme di risorse dinamiche acquisite dall'oggetto 
A me sembra che "risorse dinamiche" non sia un'espressione corretta.
Insomma, penso che se si sta insegnando qualcosa, più termini semplici
si usano, meglio è. Una risorsa è una risorsa, non esiste una risorsa
"dinamica". E' dinamico il modo di acquisirla, nel senso che la si
acquisisce a run-time, ma in programmazione, allora, TUTTO è
dinamico...

Sto seguendo ora il Deitel e il Thinking...
Almeno per il secondo, hai fatto un'ottima scelta ;-)

 Almeno per il secondo, hai fatto un'ottima scelta ;-)
Mi piace pure il primo, del secondo ho trovato impressionante la 
facilità con cui spiega le cose.
O forse è la lingua inglese che si presta per spiegare certi concetti 
tecnici oppure è bravo l'autore.
E poi, poche righe per pagine, carattere di stampa bello grosso, 
leggibilità ai massimi livelli.

Andrea Laforgia ha scritto:

IMHO il termine "risorse dinamiche" è usato e universalmente accettato 
per indicare una risorsa che ha un ciclo di vita "dinamico" cioè puoi 
decidere quando acquisirla e quando rilasciarla, a differenza di una 
"risorsa statica" che vive come tutto il programma e di una "risorsa 
automatica" che decidi quando nasce ma muore automaticamente quando esce 
di scope.
Poi sono d'accordo che si può anche dire "risorsa ad acquisizione 
dinamica" ma per me è la stessa cosa.
GM

IMHO il termine "risorse dinamiche" è usato e universalmente accettato 
Mai sentito.

 Mai sentito.
Un paio di esempi per tutti:
tratto da 
http://www.gotw.ca/gotw/065.htm
... In particular, note that the catching code also needs to have enough 
knowledge to perform any necessary cleanup, such as of *dynamic 
resources* ...
tratto da 
http://www.accu.informika.ru/accu/bookreviews/public/reviews/o/o001796.htm
... (he even uses some smart pointers, but he forgets to provide a 
destructor for class that owns *dynamic resources*.) ...
tratto da
http://www.accu.informika.ru/accu/bookreviews/public/reviews/o/o001678.htm
...Exception classes that avoid using *dynamic resources*, ...
Se vuoi continuo...
(nota bene che le "fonti" non sono i primi pezzenti presi per la strada)
-
GM

(nota bene che le "fonti" non sono i primi pezzenti presi per la strada)
Leggi meglio. Ho detto che io non ho mai sentito questa espressione,
non che chi la usa sia un "pezzente preso per la strada".
Per me, in ogni caso, l'espressione "risorsa dinamica" non è corretta.

 tecnici oppure č bravo l'autore.
Entrambi.
Diciamo che spesso nell'inglese non ci si mette il traduttore.
Dico spesso perchč di recente ho comprato alcuni testi di analisi
funzionale di autori russi tradotti in inglese e almeno uno viene
sconsigliato precisamente per la traduzione che era piů o meno
un'interpretazione, spesso imbarazzante.
-- 
-riko

Andrea Laforgia ha scritto:

Peccato che tu hai risposto:
"Mai sentito."
alla mia affermazione
"IMHO il termine "risorse dinamiche" è usato e universalmente accettato"
Davo quindi per scontato che la tua risposta non servisse a mettere in 
chiaro il tuo parere (sicuramente autorevole e intressante), ma 
piuttosto a smentire la mia affermazione.
Con il mio post successivo, ti facevo vedere che oltre che essere IMHO 
(come avevo peraltro scritto), esisteva qualcun'altro di "autorevole" al 
mondo che usava questo termine.
E' solo che in realtà dal tono delle tue risposte percepivo una certa 
"vena polemica". Scusami se ho frainteso...
Evidentemente ho esagerato a dire "universalmente accettato" perché a 
quanto pare c'è qualcuno che non lo accetta. Ma mi sembra un concetto 
così intuitivo e degno di esistere in quanto utile a descrivere una 
certa tipologia di risorse. Altrimenti come le chiami quelle risorse che 
puoi "aprire" e che di conseguenza ti impegni poi a "chiudere"? (tipo 
files, connessioni, memoria, schede di IO, ...)
Se poi ritieni non corretta l'espressione "risorsa dinamica" ti chiedo 
di argomentare (perché a me tanto scorretta non sembra)
Ciao
GM