Newsgroup: it.comp.lang.c++
Titolo: Strani usi di this

Al di la del cattivo stile di programmazione, è sicura una cosa del genere?
classType& classType::assign( const classType& source )
{
    if( this != &source ) {
        this->~classType();
        new (this) classType( source );
    }
    return *this;
}
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
FAQ it.comp.lang.c: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm
FAQ it.comp.lang.c++: 
http://www.programmazione.it/linguaggi/c/lang_faq.htm

 }
Occorrerebbe ALMENO fare una delete this per liberare la memoria xche il
distruttore non lo fa...
Per il resto dovrebbe funzionare.
Ciao, Lvc@

 distruttore non lo fa...
NO!!! per due motivi:
1) non e' affatto detto che l'oggetto sia stato allocato dinamicamente.
2) in ogni caso il placement new (nota l'argomento aggiuntivo)
riutilizza
   la memoria originaria.
Ciao,
Nicola

 tecnica, in ogni caso dovrebbe funzionare.
Mi pare che l'unico caso in cui questa sia la sola soluzione possibile sia
quando si voglia implementare l'operatore assegnamento in una classe che
abbia dei reference come membri dati.
Max

 }
mi pare che l'operatore new debba essere ridefinito da te per fare una
chiamata del genere (intendo new( this) ). Al di là del cattivo stile di
programmazione.. ;) perchè non ridefinisci l'operatore =?
classTypr &operator =( const classType &source);

 ha scritto nel messaggio
news:Ecsy5.3723$Q23....@news.infostrada.it...



CRedo che sia una cosa abbastanza ufficliale:
tratto da: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/new
[...]
// default placement versions of operator new
inline void *operator new(size_t, void *place) throw() { return place; }
inline void *operator new[](size_t, void *place) throw() { return place; }
[...]


io ho la 2° edizione de "il linguaggio c++" di B.S. e in r.5.3.3 dice:
...
L'operatore new richiama la funzione operator new per ottenere memoria. Un
primo argomento di sizeof( T) viene fornito allocando un oggetto di tipo T.
E' possibile utilizzare il metasimbolo placement per fornire ulteriori
argomenti...
Il metasimbolo placement può essere utlizzato solo a condizione che sia
stato dichiarato un operator new() con argomenti di tipo adeguato.
...
e questo, IMHO, fa sottointendere che non esista un operator new() già
dichiarato in questo modo nello standard. Se poi è cambiato qualcosa non lo
so, ma questo dice B.S., se non ho scordato come si fa a leggere. Se poi la
libreria del gcc fa diverso non significa che debba essere lo standard.

libreria del gcc fa diverso non significa che debba essere lo standard.
Forse il libro e' vecchio. Esiste un operatore di new nello standard
che riceve come parametro addizionale, oltre alla dimensione del
blocco, un puntatore ad un'area di memoria; questo stesso valore
e' l'indirizzo restituito della memoria "allocata".
Questo operatore new di costruzione in-place (che in pratica permette
di creare una istanza in una zona di memoria scelta dal chiamante) e'
usato in maniera essenziale da tutte le implementazioni dei
contenitori standard. La sua dichiarazione e' presente in <new>.
Chi e' B.S. ? Se e' Stroustrup la descrizione del placement new
si trova a pagina 255 di "The C++ Programming Language" (terza
edizione).
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 edizione).
Terza edizione, appunto.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

 abbia dei reference come membri dati.
A mio avviso stai capovolgendo il problema: se una classe deve prevedere
l'operatore di assegnamento, non dovrebbe avere membri reference.
Ciao,
Nicola

Piu' esattamente e' definito in 5.3.4.11.
Io ho deciso di smettere di citare i documenti "quasi standard" in
mio possesso visto che non rappresetano lo standard (sono giunto
a questa decisione dopo essere stato pubblicamente ripresto da
nientepopodimeno che Francis Glassborow).
Per ora odio l'idea di dover pagare $18 dollari per lo standard
(e non si tratta di una questione di cifra) ma mi sembra corretto
non citare fonti quali i draft in mio possesso che hanno la stessa
autorevolezza della carta del formaggio quando si parla di C++.
Se tu stai citando lo standard tieni anche conto di tutti gli
aggiornamenti e le errata uscite ? (avere uno standard non
aggiornato e' come non avere lo standard).
La mia posizione (attuale) sulla cosa e': consultare sicuramente,
citare mai (piu').


 wrote in message
39cee619...@news.interbusiness.it...
