Re: signals and copy constructors



On Tue, Jan 04, 2005 at 13:19:06 -0500, Carl Nygard wrote:
> On Tue, 2005-01-04 at 17:54 +0100, Jan Hudec wrote:
> > On Tue, Jan 04, 2005 at 15:16:51 +0100, Antonio Coralles wrote:
> > > Carl Nygard wrote:
> > > 
> > > >On Mon, 2005-01-03 at 23:46 +0100, Antonio Coralles wrote:
> > > >>i know that this is more a libsigc++ question; but as gtkmm uses
> > > >>libsigc++ heavily and the libsigc++ mailinglist is not very populated i
> > > >>ask this question here too:
> > > >>
> > > >>is there an elegant way to "change  *p_obj in  mem_fun(*p_obj, ...)"
> > > >>after the signal is allredy attached to a concrete object , so that when
> > > >>the copy constructor of that object is called,  some_signal.emit(...)
> > > >>calls the method in the object created by this copy constructor call ?
> > > >>or is it better to think of a different design, so that this question
> > > >>doesn't come up ?
> > > >>
> > > >>to avoid misunderstandigs, here is somekind of example:
> > > >>
> > > >>//just a useless signal
> > > >>sigc::signal<void> someSignal;
> > > >>
> > > >>//just a useless class
> > > >>class Useless : public sigc::trackable
> > > >>{
> > > >>    public:
> > > >>    void call_me() { ... }
> > > >>};
> > > >>
> > > >>//a useless scope
> > > >>....
> > > >>{
> > > >>    Useless u1;
> > > >>    someSignal.connect(sigc::mem_fun(u1,  &Useless::call_me));
> > > >>   //ok now connected - but how can i automatically change the target
> > > >>object to u2 - so that u2.call_me() is called due someSignal.emit() ?
> > > >>   Useless u2(u1);  //imagine this call is made at a comletly different
> > > >>part in my programm - for example in a clone method ....
> > > >>   ....
> > > >>}
> > > >> ....
> > > >
> > > >This is a bad idea simply from the standpoint that C++ creates temporary
> > > >copies in a variety of situations, many of which you are not consciously
> > > >aware of.  I'd find a different design.
> > > >
> > > >BTW, you can also disconnect the signal if you store the connection info
> > > >returned when you call connect(), so you can manually disconnect and
> > > >reconnect (so long as you have the original signal).
> > > >
> > > Well, i guess you are right, I should find another way, allthough 
> > > temporary copies aren't a problem, because i could make the copy 
> > > constructor private and use it only in a virtual clone method ....; but 
> > > to store the the connection and the signal in the object to wich the 
> > > signal was connected seems messy and error prone.
> > 
> > Actualy the callback will get the signal invocant (ie. the object
> > emiting the signal) as first argument no matter whether you use a method
> > or function. So I suggest connecting a static function that invokes
> > method on it's first argument.
> 
> Huh?  You sure you're not getting the mem_fun signature mixed up with
> the sigc::signal<void>() signal signature?

No, I am not. I am confusing it with the signature of the underlying
(C level) signal, which always includes the emitting GObject.

-------------------------------------------------------------------------------
						 Jan 'Bulb' Hudec <bulb ucw cz>

Attachment: signature.asc
Description: Digital signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]