Re[2]: [gtkmm] Re: How to derive from Gtk::Toolbar_Helpers::ToggleElem ??



Yeh I already figured out the SigC thing. You can't do any slot work
in a class that's not at some point derived from a SigC::Object. I've
never had this problem before because I've always derived from
Widgets.

I did learn (via gdb) that you don't want to use 'this' in an arg list
to a base class constructor. It's pretty much undefined. I think it
should be a syntax error (or fixed so that it works. isn't the derived
class object memory already allocated at the time the base class
constructor runs? maybe not).

It's unfortunate that you can't derive from a xxxx_Helper::yyyy. What
if someone had the bright idea to create a toolbar button that drops
down a menu when pressed? Such a button would best be based on a
ToggleElem.

Well. I figured it all out eventually. My new class just isn't as nice
as it could have been. I'll post it after I add some comments.

Monday, September 29, 2003, 3:00:16 AM, you wrote:

MC> This might be relevant:
MC> http://libsigc.sourceforge.net/libsigc1_2/manual/html/ch02s02.html

MC> But more importantly, I don't think that you should be deriving from
MC> ToggleElem and adding member data. These items are meant to be stored in
MC> a container by value, so they need to all have the same data.

MC> On Mon, 2003-09-29 at 04:32, S. Myles Prather wrote:
>> Ok. No surprise. Turns out it was loser error. But PLEASE, will
>> someone explain to me why this works:
>> 
>> class ToolbarMenuElem : public Gtk::Toolbar_Helpers::ToggleElem,
>> public SigC::Object {
>>   public:
>>     ToolbarMenuElem(
>>       Gtk::Menu * menu_, const Glib::ustring & text, Gtk::Widget &
>> content, 
>>       const Glib::ustring & tooltip_text=Glib::ustring(), 
>>       const Glib::ustring & tooltip_private_text=Glib::ustring());
>> }
>> 
>> I took the time to actually attempt to figure out the error msg I
>> posted previously and something clued me in to adding the public
>> derivation of SigC::Object to the ToolbarMenuElem class. Problem is, I
>> have no clue why this worked. And how have I been writing Gtkmm
>> (sporadically) for a couple of years now and never had to do that
>> before? Yeesh this C++ GUI stuff is confusing. I'm such a Noob.
>> 
>> Myles
>> 
>> S. Myles Prather wrote:
>> > I didn't think this would work when I typed it in, and sure nuf, it
>> > don't.  I'm trying to pass arguments to the constructor of my base
>> > class (a ToggleElem), but I can't figure out how to pass in the slot
>> > (Callback0). 15 lines of code is worth a million words:
>> > 
>> > class ToolbarMenuElem : public Gtk::Toolbar_Helpers::ToggleElem {
>> >   public:
>> >     ToolbarMenuElem(
>> >       Gtk::Menu * menu_, const Glib::ustring & text, Gtk::Widget &
>> > content, 
>> >       const Glib::ustring & tooltip_text=Glib::ustring(), 
>> >       const Glib::ustring & tooltip_private_text=Glib::ustring());
>> > }
>> > 
>> > ToolbarMenuElem::ToolbarMenuElem(
>> >   Gtk::Menu * menu_, const Glib::ustring & text, Gtk::Widget &
>> > content, 
>> >   const Glib::ustring & tooltip_text, 
>> >   const Glib::ustring & tooltip_private_text)
>> >   :
>> >   Gtk::Toolbar_Helpers::ToggleElem(text, content, SigC::slot(*this,
>> > &ToolbarMenuElem::on_toggled),
>> >     tooltip_text, tooltip_private_text) {
>> > 
>> > ...
>> > 
>> > }
>> > 
>> > I'm getting a very odd compiler error that points to header files in
>> > SigC++, but I'm pretty sure it comes back to me trying to use *this
>> > in the argument list for the base class constructor call.
>> > Questions:
>> > 
>> > 1) Is there any way to accomplish what I'm trying to do?
>> > 2) If not, how do I generate a NULL slot to appease compilation? I
>> > think I can hook up the the toggled signal after I'm off and
>> > running. I tried like hell, but couldn't come up with the magic
>> > string of greek C++ to make the compiler happy.
>> > 3) When does 'this' come into existence? Shouldn't it be the first
>> > argument in the call to ToolbarMenuElem::ToolbarMenuElem(...), and
>> > therefore, available for use in the base class constructor call?
>> > i.e., at the time of the call to the ToolbarMenuElem constructor,
>> > the memory has been allocated and a pointer to it should exist,
>> > right?
>> > 4) Is this a bug/feature-request for gtk/gtkmm? Am I doing something
>> > I shouldn't be trying to do? Gtkmm brags about the ability to derive
>> > from Gtk objects. What gives? Maybe we just need a constructor that
>> > doesn't require a Callback0. Trust me, I'll hook one up later (if I
>> > feel the need)!
>> > 5) Why can't anything ever go smoothly :( ?
>> > 
>> > Much appreciation in advance! I'm at a brick wall here. Work-arounds
>> > in my head right now totally defeat the purpose of C++.
>> > 
>> > Here's the (un-intelligible?) compiler error message:
>> > 
>> > || In file included from
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h:73:
>> > || /usr/include/sigc++-1.2/sigc++/object_slot.h: In constructor 
>> > ||    `SigC::ObjectSlotNode::ObjectSlotNode(void (*)(void*), T*,
>> > void*, T2) [with 
>> > ||    T = ToolbarMenuElem, T2 = void (ToolbarMenuElem::*)()]':
>> > /usr/include/sigc++-1.2/sigc++/slot.h|211| instantiated from
>> > `SigC::Slot0<R>::Slot0(SigC::SlotNode*) [with R = void]'
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h|73| instantiated from
>> > `SigC::Slot0<R> SigC::slot(O1&, R (O2::*)()) [with R = void, O1 =
>> > ToolbarMenuElem, O2 = ToolbarMenuElem]'
>> > ToolbarMenuElem.cc|14| instantiated from here
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h|45| no matching
>> > function for call 
>> > ||    to `SigC::ObjectSlotNode::init(ToolbarMenuElem*&, void*&, void
>> > ||    (SigC::Object::*&)())'
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h|46| candidates are:
>> > void 
>> > ||    SigC::ObjectSlotNode::init(SigC::Object*, void*, void
>> > (SigC::Object::*)())
>> > || In file included from
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h:187:
>> > || /usr/include/sigc++-1.2/sigc++/object_slot.h: In constructor 
>> > ||    `SigC::ObjectSlotNode::ObjectSlotNode(void (*)(void*), T*,
>> > void*, T2) [with 
>> > ||    T = ToolbarMenuElem, T2 = void (ToolbarMenuElem::*)(int&,
>> > int&, bool&)]':
>> > /usr/include/sigc++-1.2/sigc++/slot.h|343| instantiated from
>> > `SigC::Slot3<R, P1, P2, P3>::Slot3(SigC::SlotNode*) [with R = void,
>> > P1 = int&, P2 = int&, P3 = bool&]'
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h|187| instantiated from
>> > `SigC::Slot3<R, P1, P2, P3> SigC::slot(O1&, R (O2::*)(P1, P2, P3))
>> > [with R = void, P1 = int&, P2 = int&, P3 = bool&, O1 =
>> > ToolbarMenuElem, O2 = ToolbarMenuElem]'
>> > ToolbarMenuElem.cc|28| instantiated from here
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h|45| no matching
>> > function for call 
>> > ||    to `SigC::ObjectSlotNode::init(ToolbarMenuElem*&, void*&, void
>> > ||    (SigC::Object::*&)())'
>> > /usr/include/sigc++-1.2/sigc++/object_slot.h|46| candidates are:
>> > void 
>> > ||    SigC::ObjectSlotNode::init(SigC::Object*, void*, void
>> > (SigC::Object::*)())
>> > || make: *** [ToolbarMenuElem.o] Error 1
>> _______________________________________________ gtkmm-list mailing
>> list gtkmm-list gnome org
>> http://mail.gnome.org/mailman/listinfo/gtkmm-list




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