C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Zeigerueberpruefung - Designfrage

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Robert W. Kuhn
Guest





PostPosted: Thu Mar 08, 2007 5:31 pm    Post subject: Zeigerueberpruefung - Designfrage Reply with quote



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





PostPosted: Fri Mar 09, 2007 1:21 am    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote



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





PostPosted: Fri Mar 09, 2007 3:36 am    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote



Ole Hinz wrote:
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.
Back to top
Rolf Magnus
Guest





PostPosted: Fri Mar 09, 2007 5:35 am    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

marcoh wrote:

Quote:
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.
Back to top
Thomas Maeder
Guest





PostPosted: Fri Mar 09, 2007 12:37 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

marcoh <marcoh77 (AT) freenet (DOT) de> 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.
Back to top
James Kanze
Guest





PostPosted: Fri Mar 09, 2007 6:09 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

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





PostPosted: Fri Mar 09, 2007 6:11 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

On Mar 8, 10:36 pm, marcoh <marco...@freenet.de> wrote:
Quote:
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.

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





PostPosted: Mon Mar 12, 2007 12:11 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

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





PostPosted: Mon Mar 12, 2007 12:14 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

"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





PostPosted: Mon Mar 12, 2007 8:48 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

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





PostPosted: Mon Mar 12, 2007 9:09 pm    Post subject: Re: Zeigerueberpruefung - Designfrage Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.