Hey guys,

I compiled gtkmm with GTKMM_ATKMM_ENABLED 1

Applied a simple fix, run an example gtkmm program and it works just fine!



Here is how classes inherit destructors in order: ( I marked important code
with bold )


*Glib::ObjectBase*

class ObjectBase : virtual public sigc::trackable
{
  *protected:*
        virtual ~ObjectBase() noexcept = 0; // pure virtual dtor, any
derived class dtor *won't throw.*
}



*Glib::Object*

class Object : virtual *public ObjectBase*
{
  *protected:*
       virtual ~Object() noexcept;
}



*Glib::Interface*

class Interface : virtual *public Glib::ObjectBase*
{
   *public:*
       virtual ~Interface() noexcept;
}


*Atk::Implementor*

class Implementor : *public Glib::Interface*
{
    public:
         virtual ~Implementor() noexcept; *// I think this is bad, you'll
see why ...*

}

*Gtk::Widget*

class Widget : public Object, public Buildable
*#ifdef GTKMM_ATKMM_ENABLED*
  ,*public Atk::Implementor*
{
  //...
}


Now let's see the implementation of Atk::~Implementor()

*Implementor::~Implementor() noexcept { }* * // do you see why this is bad
?*



Atk::~Implementor is defined but it can't call Glib::Object::~Object()
*because Glib::Object::~Object() is declared protected*

I have removed ~Implementor() destructor and let the compiler generate one.
recompiled atkmm and it now it works just fine!

Please give your opinion, did I do the right thing? I'm not 100% sure.


On Wed, Nov 18, 2015 at 3:07 PM, John Emmas <[email protected]> wrote:

> On 18/11/2015 12:39, John Emmas wrote:
>
>
>    //Any instantiable class that derives from Interface should also
> inherit from Object.
>
> I noticed that Atk::Implmentor does derive from Glib::Interface but it
> doesn't inherit from Object.  Could that be the problem?
>
>
> I just discovered something else interesting...  I don't know if this is
> technically valid code but FWIW, even something as simple as this hangs:-
>
>     int main (int argc, char *argv[])
>     {
>         Atk::Implementor  *imp = new Atk::Implementor (NULL);
>
>         delete imp;  // <-- hangs here !!
>
>         return 0;
>     }
>
> _______________________________________________
> gtkmm-list mailing list
> [email protected]
> https://mail.gnome.org/mailman/listinfo/gtkmm-list
>
>
_______________________________________________
gtkmm-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to