Newsgroup: it.comp.lang.visual-basic
Titolo: puntatori agli oggetti

in VB 6, ho due oggetti: A e B
dim A as new MyObject
dim B as new MyObject
se scrivo
A=B
ottengo due puntatori allo stesso blocco in memoria, giusto?
come faccio allora ad assegnare ad A tutte le proprietà di B, evitando 
che puntino allo stesso blocco?
ovviamente non voglio assegnare le proprietà una ad una..
giovanni
Inviato da 
www.mynewsgate.net

Montag <60...@mynewsgate.ned.invalid> ha scritto:

scusate, volevo scrivere
Set A = B
Inviato da 
www.mynewsgate.net

 ovviamente non voglio assegnare le proprietà una ad una..
E' l'unico modo, ma puoi renderlo meno "pesante" con il suggerimento di
sopra.
<-- begin MyClass.cls -->
Private pMyTypProperty As String
Private pMyObjProperty As Object
'...
Public Property Get MyTypProperty() As String
    MyTypProperty = pMyTypProperty
End Property
'... (Let)
Public Property Get MyTypProperty() As Object
    Set MyObjProperty = pMyObjProperty
End Property
'... (Set)
Public Function Clone() As MyClass
    Dim ret As MyClass
    With ret
        .MyTypProperty = pMyTypProperty
        Set .MyObjProperty = pMyObjProperty
        '...
    End With
    Set Clone = ret
    Set ret = Nothing
End Function
<--end MyClass.cls-->
<--begin test-->
Dim A As MyClass
Dim B As MyClass
Set B = A.Clone
<--end test-->
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

Set A = B

 vi dico come va a finire.
Non ce la fai perchè la memoria degli oggetti non è contigua
Inoltre andrebbe considerato il problema della copia "superficiale" e 
"profonda", cioè se copiare solo eventuali riferimenti degli oggetti 
contenuti oppure il valore di questi (e fino a che profondità).
Ciao

 ovviamente non voglio assegnare le proprietą una ad una..
Se non č lo stesso oggetto a fornirti un metodo Clone o simile, che ti crei
un'istanza di un oggetto e poi la caratterizzi esattamente come l'originale,
la copia di un oggetto č una cosa scorretta formalmente.
Per quanto si possa ottenere qualche risultato giochicchiando con le aree di
memoria, ciņ č secondo me contrario allo spirito della programmazione OO.
Le proprietą di un oggetto, infatti, sono una cosa ben diversa da variabili
public in un modulo. Tu puoi 'inserire' un valore in una proprietą, e subito
dopo andare a leggerlo e trovare un valore diverso. Puoi scrivere un valore
in una proprietą in un istante, e leggendola trovare un valore, poi puoi
scriverlo in un altro istante e trovare un valore diverso da quello
precedente.
Le proprietą, infatti, sono sostanzialmente delle function, che svolgono
effettivamente delle cose. E molto probabilmente, andando a copiare 'a
brutto' le aree di memoria, non č detto che l'oggetto sia identico, perchč
impostando una proprietą č possibile che vengano eseguite una serie di cose
all'esterno dell'oggetto.
Prendi come esempio un oggetto Form. Se imposti Visible=True, č vero che
scrivi un qualcosa nella memoria propria di questo oggetto, ma
contestualmente vengono scatenati degli eventi di sistema che, ad esempio,
fanno sapere al sistema operativo che il tal Form č visibile. Se prendi un
oggetto Form e ne fai una copia 'in memoria', quasi sicuramente esso non
funzionerą, non essendo puntato da alcunchč dal sistema operativo.
Ciao
Alberto

 la copia di un oggetto è una cosa scorretta formalmente.
Beh se sei tu a scrivere la classe ed a fornirla di un metodo
Clone non vedo perche' =)



Ovvio che stavo pensando a una copia di primo livello. Se devo fare
una cosa un po' piu' seria (stringhe, eventuali oggetti riferiti
internamente, vettori dinamici), la cosa migliore e' il metodo di
copia, senno' uno impazzisce. 
E' che non ricordo bene come si usa la libreria Kernel 32, - Le
funzioni che iniziano per Heap... - e in questo momento non ho tempo
per rinfrescarmi le idee - . Se mi avanzano un paio d'ore durante il
WE gli do un occhio.......
Ciao!
Luca

 Clone non vedo perche' =)
Ho riletto diverse volte la tua frase, e non la capisco.
Ho iniziato dicendo che la stessa cosa che hai detto tu...
Alberto

 ha scritto nel messaggio
news:c68qsb$9avnb$1...@ID-222113.news.uni-berlin.de...

ok ragazzi, vi dico che la classe per questi oggetti l'ho creata io.
come implemento correttamente il metodo Clone?

 
Leggendo *tutte* le risposte fino in *fondo* !
:-(
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 ovviamente non voglio assegnare le proprietą una ad una..
o copi a manina, o sfrutti la persistenza: 
http://snipurl.com/5w8p
(leggiti tutto il thread)
Ciao,
Moreno

 Moreno
è pazzesco che non ci sia un metodo automatico!!!
siccome devo manipolare in questo modo una gran quantità di oggetti 
all'interno della stessa funzione, devo scartare la storia della 
scrittura su file, e procedere "a manina" (ho 7 oggetti distinti :(( )
giovanni
Inviato da 
www.mynewsgate.net

 Inviato da 
www.mynewsgate.net
Ti invito a considerare quanto ti han già detto....non si parla di valori ma
di oggetti
Un conto è fare una collection di oggetti....e aggiungerli.....
un conto copiarli.....
un altro clonarli....
Un conto è inserire in una collection un altra Cpersona con i dati già
preassegnati
un altro Clonare un oggetto....in cosa e come?...pensa ad un recordset....se
lo clono...clono anche la sua connessione ?...se cade? cade anche per il
clonato?
un altro Copiare un oggetto....in cosa?...in un altro oggetto?.....sempre
pensando al recordset....posso sbizzarrirmi e copiarlo su un altro recordset
con una connessione diversa? ( se i campi e le tabelle son simili caso mai
passando come diceva Moreno...un po di Xml e rs.save???)..
Certo che non c'è un modo automatico...che ne sa la M$ e noi che cosa vuoi
fare???...ci provano a sondare le nostre menti ma per ora ottengono solo
"System error!!!"
:-)
-- 
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici
---
Posta in uscita controllata con AVG Antivirus
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.659 / Virus Database: 423 - Release Date: 15/04/2004

 è pazzesco che non ci sia un metodo automatico!!!
Questa osservazione, alla luce di quanto ti è già stato detto, mi fa pensare
che le tue basi di programmazione OO abbiano qualche lacuna.
Come detto, la copia di un oggetto è una cosa che deve essere gestita dalla
classe, non è corretto farla dall'esterno. Neppure riproducendo le
assegnazioni di proprietà precedentemente eseguite, si è sicuri di avere una
vera copia.
Per cui, se la classe è tua, crea un metodo .Clone che istanzi un nuovo
oggetto, riporti gli stati delle varie mVarxxxx in stati identici agli
originali, e poi restituisca il puntatore a questo nuovo oggetto. E'
importante che il puntatore, al nuovo oggetto, che sfrutti durante il
ripristino degli stati, sia una variabile locale alla function del metodo,
in modo che ci sia una disconnessione fra oggetto originale e oggetto clone,
non appena il puntatore viene restituito all'istanziante.
Ciao
Alberto

 cosa che hai detto tu...
Ma hai continuato spiegando per filo e per segno che "clonare"
oggetti e' male. Dato che dal post originale si evince che
le classi le scrive lui, non capivo l'accanimento =).
In ogni caso, effettivamente, la tua precisazione iniziale
avrebbe dovuto fugare i miei dubbi... =)


 oggetti e' male.
Non proprio.
Ho detto che 'copiare' oggetti senza un metodo clone è male.
Comunque chiarito il missingunderstanding.
Alberto

Wodka40°(win2k) <marco_1...@martek.it_TOGLI_QUI> ha scritto:

comprendo i rischi
però per come la vedo io il programmatore dovrebbe essere libero di agire in 
questo senso, presupponendo che conosca quello che manipola.
ciao
giovanni
Inviato da 
www.mynewsgate.net

 
grazie, ho proceduto proprio in questo senso, anche se non è il massimo della 
flessibilità, visto anche che devo gestire 7 oggetti distingi..
giovanni
Inviato da 
www.mynewsgate.net

 sono oggetti che è meglio non clonare. Ma.....
Attenzione: la cosa non è gestita in automatico.
Sei tu che devi aggiungere il metodo Clone alla classe e gestirti la 
clonazione (infatti insieme a Clone() c'è anche sempre la 
MemberWiseClone()).
Non ho invece idea di come funzioni la serializzazione.
Ciao

 stato fatto notare, ci sono oggetti che è meglio non clonare.
Devi ribaltare il concetto: "Ci sono oggetti che è possibile clonare 'a
brutto grugno'", ma in generale la clonazione di un oggetto dall'esterno è
una cosa sbagliata, spesso impossibile.
Ciao
Alberto