 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Robert W. Kuhn Guest
|
Posted: Thu Mar 08, 2007 5:31 pm Post subject: Zeigerueberpruefung - Designfrage |
|
|
Hallo,
ich habe eine Klasse A und eine Klasse B. B hat als Member einen Zeiger
auf A (der natürlcih auch NULL sein kann). Nun kann das Objekt, auf das
der Pointer zeigt, gelöscht werden. Ich kann natürlich bei dieser
Löschung auch alles Bs, die ich habe, durchgehen und schauen, ob ein B
einen Zeiger auf das A hat, welches ich gerade lösche, und denn NULL
setzen. Finde ich aber unschön.
Auch, das jedes A einen Zeiger auf sein B hat und sich da abmeldet
gefällt mir nicht richtig. Weil eigentlich A ja nichts vom B wissen muß..
Wie kann man das besser lösen? Gibt es da einen schöneren Weg?
Tschau - Robert
--
vertrau
voraus voraus |
|
| Back to top |
|
 |
Ole Hinz Guest
|
Posted: Fri Mar 09, 2007 1:21 am Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
Robert W. Kuhn wrote:
| Quote: | Auch, das jedes A einen Zeiger auf sein B hat und sich da abmeldet
gefällt mir nicht richtig. Weil eigentlich A ja nichts vom B wissen muß.
Wie kann man das besser lösen? Gibt es da einen schöneren Weg?
Tschau - Robert
|
Ist vielleicht ein shared_ptr das, was Du suchst?
http://www.boost.org/libs/smart_ptr/shared_ptr.htm
Gruß
Ole
--
http://www.ole-hinz.de |
|
| Back to top |
|
 |
marcoh Guest
|
Posted: Fri Mar 09, 2007 3:36 am Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
Ole Hinz wrote:
Wieso stellst du ihm die Frage? Sag ihm doch ganz klar, das es dafür
Shared-Pointer gibt, die genau diesen Zweck erfüllen. |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Mar 09, 2007 5:35 am Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
marcoh wrote:
Tun sie aber nicht - zumindest nicht alleine. Robert sucht etwas
vergleichbares mit einem Smartpointer, der automatisch Null wird, wenn das
Objekt zerstört wird, und nicht einen, der das Objekt so lange hält, bis er
selbst zerstört wird.
Das scheint bei boost durch die Klasse weak_ptr zusammen mit shared_ptr
möglich zu sein. |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Mar 09, 2007 12:37 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
marcoh <marcoh77 (AT) freenet (DOT) de> writes:
Also ich z.B. finde, dass shared_ptr diesen Zweck nicht erfüllen.
Der OP will ja nicht ein Objekt am Leben erhalten, bis alle Referenzen
verschwunden sind, sondern ein Objekt zu einem bestimmten Zeitpunkt
zerstören und dabei "hängende" (wie sagt man "dangling" auf deutsch?)
Referenzen vermeiden. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Fri Mar 09, 2007 6:09 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
On Mar 8, 12:31 pm, 2...@ku.hn (Robert W. Kuhn) wrote:
| Quote: | ich habe eine Klasse A und eine Klasse B. B hat als Member einen Zeiger
auf A (der natürlcih auch NULL sein kann). Nun kann das Objekt, auf das
der Pointer zeigt, gelöscht werden. Ich kann natürlich bei dieser
Löschung auch alles Bs, die ich habe, durchgehen und schauen, ob ein B
einen Zeiger auf das A hat, welches ich gerade lösche, und denn NULL
setzen. Finde ich aber unschön.
Auch, das jedes A einen Zeiger auf sein B hat und sich da abmeldet
gefällt mir nicht richtig. Weil eigentlich A ja nichts vom B wissen muß.
|
Das heißt den "Observer"-Muster. A soll zwar nichts vom B
wissen, weiß aber, dass jemand über ihm interessiert sein kann.
Also unterstützt er Observer. Und B meldet sich als Observer an.
Typisherweise wird so was durch eine abstrakte Klasse in A
implementiert, also:
class A
{
public:
class Observer
{
public:
virtual ~Observer() {} ;
virtual void objectDeleted() = 0 ;
// andere Anmeldungen?
} ;
// ...
} ;
Danach erbe B von A::Observer (oder benutzt ein Hilfsobjet, das
von A::Observer erbt), und meldet sich an.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Fri Mar 09, 2007 6:11 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
On Mar 8, 10:36 pm, marcoh <marco...@freenet.de> wrote:
Vielleicht, weil boost::shared_ptr nicht entspricht, genau was
er beschrieben hat, und um es zu benutzen, muss er seine Design
etwas umstellen.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Robert W. Kuhn Guest
|
Posted: Mon Mar 12, 2007 12:11 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
Thomas Maeder <jvxexluzrgmr (AT) mailinator (DOT) com> writes:
| Quote: | Ist vielleicht ein shared_ptr das, was Du suchst?
http://www.boost.org/libs/smart_ptr/shared_ptr.htm
Wieso stellst du ihm die Frage? Sag ihm doch ganz klar, das es dafür
Shared-Pointer gibt, die genau diesen Zweck erfüllen.
Also ich z.B. finde, dass shared_ptr diesen Zweck nicht erfüllen.
Der OP will ja nicht ein Objekt am Leben erhalten, bis alle Referenzen
verschwunden sind, sondern ein Objekt zu einem bestimmten Zeitpunkt
zerstören und dabei "hängende" (wie sagt man "dangling" auf deutsch?)
Referenzen vermeiden.
|
Jupp.
Tschau - Robert
--
vertrau
voraus voraus |
|
| Back to top |
|
 |
Robert W. Kuhn Guest
|
Posted: Mon Mar 12, 2007 12:14 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
"James Kanze" <james.kanze (AT) gmail (DOT) com> writes:
| Quote: | On Mar 8, 12:31 pm, 2...@ku.hn (Robert W. Kuhn) wrote:
ich habe eine Klasse A und eine Klasse B. B hat als Member einen Zeiger
auf A (der natürlcih auch NULL sein kann). Nun kann das Objekt, auf das
der Pointer zeigt, gelöscht werden. Ich kann natürlich bei dieser
Löschung auch alles Bs, die ich habe, durchgehen und schauen, ob ein B
einen Zeiger auf das A hat, welches ich gerade lösche, und denn NULL
setzen. Finde ich aber unschön.
Auch, das jedes A einen Zeiger auf sein B hat und sich da abmeldet
gefällt mir nicht richtig. Weil eigentlich A ja nichts vom B wissen muß.
Das heißt den "Observer"-Muster. A soll zwar nichts vom B
wissen, weiß aber, dass jemand über ihm interessiert sein kann.
Also unterstützt er Observer. Und B meldet sich als Observer an.
|
Ah, ans Observerpattern habe ich noch garnicht gedacht (wohl schon mal
gemacht). Und A sagt dann allen Beobachter, daß es gleich den Weg alles
irdischen geht und die können dann ihre Referenz auf 0 setzen.
Ich glaub, so mache ich es. Danke!
Tschau - Robert
--
vertrau
voraus voraus |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Mar 12, 2007 8:48 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
On Mar 9, 12:35 am, Rolf Magnus <ramag...@t-online.de> wrote:
| Quote: | marcoh wrote:
Ole Hinz wrote:
Ist vielleicht ein shared_ptr das, was Du suchst?
http://www.boost.org/libs/smart_ptr/shared_ptr.htm
Wieso stellst du ihm die Frage? Sag ihm doch ganz klar, das es dafür
Shared-Pointer gibt, die genau diesen Zweck erfüllen.
Tun sie aber nicht - zumindest nicht alleine. Robert sucht etwas
vergleichbares mit einem Smartpointer, der automatisch Null wird, wenn das
Objekt zerstört wird, und nicht einen, der das Objekt so lange hält, bis er
selbst zerstört wird.
Das scheint bei boost durch die Klasse weak_ptr zusammen mit shared_ptr
möglich zu sein.
|
Das geht nur insofern, dass das einzige, dass er machen will,
ist der Zeiger auf null setzen. Was bedeutet u.A., dass er nur
1->1 Verhältnisse hat; wenn er 1->n hat, dann hat er
wahrscheinlich die Zeiger in einem std::set bzw. einem
std::vector, und muss es eher darauslöschen. (Ich habe selber
eine Art weak_ptr vor ungefähr 10 Jahre entwickelt. Und seitdem
nie benutzt, was das Aufnullsetzen nie ausgereicht hat.)
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Mon Mar 12, 2007 9:09 pm Post subject: Re: Zeigerueberpruefung - Designfrage |
|
|
On Fri, 09 Mar 2007 07:37:17 +0100, Thomas Maeder
<jvxexluzrgmr (AT) mailinator (DOT) com> wrote:
| Quote: | "hängende" (wie sagt man "dangling" auf deutsch?) Referenzen
|
Am einfachsten wäre schon: "hängende Referenzen".
Etwas genauer: "Mit den Beinen hilflos in der Luft zappelnde
Referenzen".
"Dangling" ist da schon etwas bildhafter! :)
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|