PDA

View Full Version : [.net] Rilevare dangling object


_Claudio
29-09-2009, 22:35
Come da titolo, voglio rilevare se un oggetto
System:: Drawing::Graphics^
è stato inizializzato o meno.

In questo caso ho un oggetto di questo tipo, ma in generale come si può rilevare se un oggetto gestito è stato inizializzato o meno?

Poi un'altra domanda che non centra nulla:
come è possibile fare l'overload dell'operatore = senza creare le relative getters e copiare membro a membro da un oggetto all'altro?

Se io ho una classe reticolo e creo:

reticolo a;
reticolo b = reticolo(x, y, z);

e faccio:
a = b;


devo definire:

reticolo^ operator=(reticolo r) {
this->a = r.geta();
this->b = r.getb();
this->c = r.getc();
return this;
}


Non c'è un modo più semplice?

tomminno
29-09-2009, 23:22
Come da titolo, voglio rilevare se un oggetto
System:: Drawing::Graphics^
è stato inizializzato o meno.

In questo caso ho un oggetto di questo tipo, ma in generale come si può rilevare se un oggetto gestito è stato inizializzato o meno?


Mi sembra di capire che stai facendo riferimento al C++/CLI.
Non ti basta verificare se l'oggetto è != nullptr?


Poi un'altra domanda che non centra nulla:
come è possibile fare l'overload dell'operatore = senza creare le relative getters e copiare membro a membro da un oggetto all'altro?

Se io ho una classe reticolo e creo:

reticolo a;
reticolo b = reticolo(x, y, z);

e faccio:
a = b;


devo definire:

reticolo^ operator=(reticolo r) {
this->a = r.geta();
this->b = r.getb();
this->c = r.getc();
return this;
}


Non c'è un modo più semplice?

Wow qui stai un pò mischiando C++ e C++/CLI, definisci l'operatore copia come se fossi in C++ ma gli fai ritornare una reference .NET.
Perchè non usare esclusivamente reference .NET?

reticolo^ a = nullptr;
reticolo^ b = gcnew reticolo(x, y, z);

a = b;

_Claudio
29-09-2009, 23:55
Mi sembra di capire che stai facendo riferimento al C++/CLI.
Non ti basta verificare se l'oggetto è != nullptr?



Wow qui stai un pò mischiando C++ e C++/CLI, definisci l'operatore copia come se fossi in C++ ma gli fai ritornare una reference .NET.
Perchè non usare esclusivamente reference .NET?

reticolo^ a = nullptr;
reticolo^ b = gcnew reticolo(x, y, z);

a = b;


Dunque nullptr funziona... avevo bisogno della parolina magica.

Può sembrare che io mi sia ammattito ma purtroppo ho una classe gestita (C++/CLI) che accede ad un oggetto graphics e mi gestisce il disegno in base a vari parametri.
Mi sono ammazzato scrivendo l'overload dell'operatore = e costruttori copia quando invece mi ero solo dimenticato un ^ nella definizione... mi sembrava strano che mi vedeva l'oggetto intero e non come riferimento, mannaggia a me, un intero pomeriggio perso così.

Non capisco se questo sia il bello o il brutto del realizzare un software.

Comunque grazie 1000, la ruggine inizia a scrostarsi piano piano, anni di Java e programmazione sul web sono deleteri rispetto alla gestione diretta di TUTTO che si fa con C++.

tomminno
30-09-2009, 00:56
Comunque grazie 1000, la ruggine inizia a scrostarsi piano piano, anni di Java e programmazione sul web sono deleteri rispetto alla gestione diretta di TUTTO che si fa con C++.

Di niente ma...
quello lì NON E' C++.
E' C++/CLI che a dispetto del nome ha poco a che spartire con il vero C++.

_Claudio
30-09-2009, 09:48
Di niente ma...
quello lì NON E' C++.
E' C++/CLI che a dispetto del nome ha poco a che spartire con il vero C++.

Lo so, e maledico il giorno che la microsoft ha deciso di tradurre tutto in CLI cambiando notazioni e quant'altro... potevano lasciare almeno la sintassi uguale al C++... troppo semplice.

Il programma che sto facendo ha le classi base in C++ puro, e l'interfaccia Windows Forms in C++/CLI, e quando devo integrare pani e pesci sono sempre testate al muro.