Newsgroup: it.comp.programmare.win32
Titolo: [C++ Builder] Copiare oggetti

Salve,
ho questo codice:
class Palla {
    public :
        TShape* C;
        int x, y, vel, dec, inc_x, inc_y, inc_c;
};
Palla P[10];
Con l'istruzione
P[0] = P[1];
Non dovrei copiare tutto quello che c'� nell'oggetto P[1] (comprese tutte le 
propriet� del membro C) in P[0]?
Ma questo non avviene. Devo usare qualche funzione particolare (tipo clone 
in Java)? 

 particolare (tipo clone in Java)?
Sei sicuro che vuoi anche copiare il puntatore? Di solito
l'intenzione è quella di replicare l'oggetto con la sua
zona di memoria, mentre facendo come fai i due puntatori
punteranno allo stesso indirizzo.
ciao
Apx.
-- 
"Ricordo la volta che mi hanno rapito: hanno mandato
un pezzo del mio dito a mio padre. Lui ha risposto
che voleva un'altra prova."

 come fai i due puntatori punteranno allo stesso indirizzo.
Devo duplicare gli oggetti, e pensavo che l'assegnazione fosse 
sufficiente, trattandosi di Array.
Per il campo TShape l'uso della dereferenziazione mi dava errore dicendo 
che non era applicabile a oggetti con proprietà... forse ho sbagliato 
qualcosa nella scrittura?
Tu come duplicheresti l'oggetto TShape?
Anzi, in generale, come copieriesti l'elemento di un array nell'altro, 
rendendo i vari campi puntatori indipendenti?
 
Ciao

 indipendenti?
Io sono uno sciaquino e non so... Visto che me lo chiedi,
potresti dichiarare e definire il costruttore di
assegnazione, poi all'interno del costruttore ci sarà
un'istruzione opportuna. Qualcosa tipo:
Palla  &Palla::operator = (const Palla  &el1)
{
   C = new Tshape ;
   (*C) = (el1->C) ;
}
Ma non sono affatto sicuro: ammetto che quando devo
scrivere cose per me non intuitive copio pezzi di codice,
che ora non ho sottomano perché non ho la flat e sto
rispondendo di fretta.
Sicuramente qualcuno competente ti dirà di più e/o
correggerà me.


Semplifichiamo tutto:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Button2 = Button3;
    Button2->Left = 140;
}
Chi sa dirmi un modo (non penso che si debba per forza implementare da se un 
operatore) per far si che il Left di Button2 e Button3 non siano lo stesso 
oggetto?
Ho provato:
*Button2 = *Button3
ma
[C++Error] Unit1.cpp(19): Classes with properties cannot be copied by value. 

Alla fine ho scritto un operator=
class Palla {
    public :
        TShape* C;
        int x, y, vel, dec, inc_x, inc_y, inc_c;
        operator= (Palla p) {
            C = new TShape(BiliardoForm->tavolo);
            C->Parent = p.C->Parent;
            C->Brush->Color = p.C->Brush->Color;
            C->Pen->Color = p.C->Pen->Color;
            C->Height = p.C->Height;
            C->Width = p.C->Width;
            C->Shape = p.C->Shape;
            C->Visible = true;
            C->Left = p.C->Left;
            C->Top = p.C->Top;
            x = p.x;
            y = p.y;
            vel = p.vel;
            dec = p.dec;
            inc_x = p.inc_x;
            inc_y = p.inc_y;
            inc_c = p.inc_c;
            delete p.C;
        };
};
In questo modo copio l'oggetto e cancello il vecchio. 

 Alla fine ho scritto un operator=
Giï¿œ che ci sei crea anche un costruttore di copia... magari con quello
ti risparmiavi pure tutti sti problemi.

 ti risparmiavi pure tutti sti problemi.
Nel mio codice gli oggetti quando vengono creati non hanno mai bisogno di 
avere un altro oggetto come parametro, mi serve solo in un caso, in cui 
appunto � necessario l'assegnamento.
Saluti