 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Peter Sommerfeld Guest
|
Posted: Fri Mar 10, 2006 7:59 am Post subject: Delegation |
|
|
Hi,
ich bin dabei mich an Hand eines kleinen
GUI-Projektes in C++ einzuarbeiten und
stoße bei der Delagation auf ein Problem
das ich nicht verstehe:
Ich habe 2 Klassen:
class FrameHandler; // foreward
class Frame {
int x,y,
width,height;
public:
FrameHandler* handler;´ // nur vorläufig public
Frame(FrameHandler *fh):
x(0),y(0), width(0 ),height(0),handler(fh){}
};
class FrameHandler{
public:
virtual bool onMousDown(Frame * frame, int x, int y){
return false;
};
...
}
Ich denke die Absicht ist ersichtlich: Frame
soll als Proxy/Handle oder wie immer man das
nennt für FrameHandler dienen und der operiert
andererseits auf Frame.
Das funktioniert so auch, also z.B
Frame * frame = new Frame(new FrameHandler());
frame->handler->onMouseDown(...);
Wenn ich aber den FrameHandler jetzt privat mache
und den Dereferenzierungsoperator verwenden will,
also
FrameHandler* operator->(){return handler;}
und dann
frame->onMouseDown(...);
aufrufe bekomme ich die Fehlermeldung dass Frame
kein Member onMouseDown hat.
Habe ich da den Dereferenzierungsoperator falsch
verstanden oder was mache ich da falsch bzw. wie
realisiert man Delegation richtig ?
tia, Peter
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Fri Mar 10, 2006 2:07 pm Post subject: Re: Delegation |
|
|
On Fri, 10 Mar 2006 14:51:48 +0100, Bob Hairgrove
<invalid (AT) bigfoot (DOT) com> wrote:
| Quote: | Wenn ich aber den FrameHandler jetzt privat mache
und den Dereferenzierungsoperator verwenden will,
also
FrameHandler* operator->(){return handler;}
und dann
frame->onMouseDown(...);
aufrufe bekomme ich die Fehlermeldung dass Frame
kein Member onMouseDown hat.
Grundsätzlich sollte Frame::operator->() immer ein Frame* zurückgeben.
Meines Erachtens sollte das gar nicht einmal kompilieren, denn das
eingebaute operator-> kann man nicht überladen, wenn nur der
Rückgabetyp anders ist.
|
Da muss ich mich korrigieren ... das eingebaute operator-> ist nur für
Zeiger wirksam; deshalb kann man ja auch überhaupt erst "smart
pointers" implementieren, weil der Syntax doch erlaubt ist.
Um das aufzurufen, müsstest Du es allerdings so machen:
((*frame).operator->())->onMouseDown( /* etc. */ );
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Fri Mar 10, 2006 2:07 pm Post subject: Re: Delegation |
|
|
On Fri, 10 Mar 2006 03:59:53 +0100, "Peter Sommerfeld"
<peter.sommerfeld (AT) aon (DOT) at> wrote:
| Quote: | Hi,
ich bin dabei mich an Hand eines kleinen
GUI-Projektes in C++ einzuarbeiten und
stoße bei der Delagation auf ein Problem
das ich nicht verstehe:
Ich habe 2 Klassen:
class FrameHandler; // foreward
class Frame {
int x,y,
width,height;
public:
FrameHandler* handler;´ // nur vorläufig public
Frame(FrameHandler *fh):
x(0),y(0), width(0 ),height(0),handler(fh){}
};
class FrameHandler{
public:
virtual bool onMousDown(Frame * frame, int x, int y){
return false;
};
...
}
Ich denke die Absicht ist ersichtlich: Frame
soll als Proxy/Handle oder wie immer man das
nennt für FrameHandler dienen und der operiert
andererseits auf Frame.
Das funktioniert so auch, also z.B
Frame * frame = new Frame(new FrameHandler());
|
Hier gibt es ein potentielles "memory leak" ... der Speicher, der
durch "new FrameHandler()" alloziiert wird, wird offenbar nirgends
freigegeben. Wenn die Instanz von Frame den Zeiger "besitzen" wird,
sollte die Initilisierung des FrameHandler* innerhalb der
Initialisierungsliste vom Constructor von Frame geschehen, i.e.:
Frame(FrameHandler *fh = 0)
: x(0)
, y(0)
, width(0 )
, height(0)
, handler(fh ? fh : new FrameHandler()){}
Noch besser wäre es, einen "smart pointer" zu verwenden...
| Quote: | frame->handler->onMouseDown(...);
Wenn ich aber den FrameHandler jetzt privat mache
und den Dereferenzierungsoperator verwenden will,
also
FrameHandler* operator->(){return handler;}
und dann
frame->onMouseDown(...);
aufrufe bekomme ich die Fehlermeldung dass Frame
kein Member onMouseDown hat.
|
Grundsätzlich sollte Frame::operator->() immer ein Frame* zurückgeben.
Meines Erachtens sollte das gar nicht einmal kompilieren, denn das
eingebaute operator-> kann man nicht überladen, wenn nur der
Rückgabetyp anders ist.
| Quote: | Habe ich da den Dereferenzierungsoperator falsch
verstanden oder was mache ich da falsch bzw. wie
realisiert man Delegation richtig ?
|
Du hast einige Optionen:
1. FrameHandler als "pImpl" implementieren und eine eigene
Funktion Frame::onMouseDown implementieren, die
FrameHandler::onMouseDown ruft;
2. Frame kann von FrameHandler erben;
3. Frame als Template-Klasse definieren, die als Template-
Parameter einen Typ erwartet, der eine Funktion
onMouseDown definiert. Entweder kann die Template-Klasse
vom Parameter erben oder eine eigene Instanz halten.
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Vinzenz 'evilissimo' Feen Guest
|
Posted: Fri Mar 10, 2006 6:06 pm Post subject: Re: Delegation |
|
|
Bob Hairgrove schrieb:
| Quote: | On Fri, 10 Mar 2006 14:51:48 +0100, Bob Hairgrove
invalid (AT) bigfoot (DOT) com> wrote:
Wenn ich aber den FrameHandler jetzt privat mache
und den Dereferenzierungsoperator verwenden will,
also
FrameHandler* operator->(){return handler;}
und dann
frame->onMouseDown(...);
aufrufe bekomme ich die Fehlermeldung dass Frame
kein Member onMouseDown hat.
Grundsätzlich sollte Frame::operator->() immer ein Frame* zurückgeben.
Meines Erachtens sollte das gar nicht einmal kompilieren, denn das
eingebaute operator-> kann man nicht überladen, wenn nur der
Rückgabetyp anders ist.
Da muss ich mich korrigieren ... das eingebaute operator-> ist nur für
Zeiger wirksam; deshalb kann man ja auch überhaupt erst "smart
pointers" implementieren, weil der Syntax doch erlaubt ist.
Um das aufzurufen, müsstest Du es allerdings so machen:
((*frame).operator->())->onMouseDown( /* etc. */ );
|
Nein.
So:
(*f)->OnMouseClick();
BR
Vinzenz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Peter Sommerfeld Guest
|
Posted: Fri Mar 10, 2006 6:06 pm Post subject: Re: Delegation |
|
|
Bob Hairgrove wrote:
| Quote: | Noch besser wäre es, einen "smart pointer"
zu verwenden...
|
Hmmm, an sowas dachte ich ja, nur das der
SmartPtr (Frame) noch einige Daten mit sich
rumschleppt und gehofft habe es ginge auch
ohne Template.
| Quote: | Du hast einige Optionen:
1. FrameHandler als "pImpl" implementieren
und eine eigene Funktion Frame::onMouseDown
implementieren, die FrameHandler::onMouseDown
ruft;
|
Klar dass das geht, ist aber reichlich umständlich
und nicht so gut hinsichtlich nachträglicher
Veränderungen in FrameHandler.
| Quote: | 2. Frame kann von FrameHandler erben;
|
Will ich nicht, da der FrameHandler während der
Laufzeit änderbar sein soll, das ist ja der Sinn
von Delegation.
| Quote: | 3. Frame als Template-Klasse definieren, die als
TemplateParameter einen Typ erwartet, der eine
Funktion onMouseDown definiert. Entweder kann
die Template-Klasse vom Parameter erben oder eine
eigene Instanz halten.
|
Muss ich mir mal anschauen, kenne mich mit Templates noch
nicht so aus aber wird wohldie Lösung sein. Im Buch von
Stroustroup wir das ja so implementiert.
[anderes posting]
| Quote: | Um das aufzurufen, müsstest Du es allerdings so machen:
|
((*frame).operator->())->onMouseDown( /* etc. */ );
Hmm, auch nicht das Gelbe vom Ei ...
Anyway, danke erst mal soweit! Ich werde mir die
Sache mit den Templates mal ansehen oder aber den
FrameHandler public lassen.
Peter
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| 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
|
|