Sdílené prostředky

Některé objekty, jako jsou Gdk::Pixbuf a Pango::Font, se získávají ze sdíleného úložiště. Proto u nich nemůžete vytvářet své vlastní instance. Tyto třídy bývají typicky zděděné z Glib::Object. Místo aby gtkmm vyžadovalo reference a dereference na takovéto objekty, používá chytré ukazatele Glib::RefPtr<>. Cairomm má svůj vlastní chytrý ukazatel Cairo::RefPtr<>.

Objects such as Gdk::Pixbuf can only be instantiated with a create() function. For instance,

auto pixbuf = Gdk::Pixbuf::create_from_file(filename);

You have no way of getting a bare Gdk::Pixbuf. In the example, pixbuf is a smart pointer, so you can do this, much like a normal pointer:

auto width = 0;
if(pixbuf)
{
  width = pixbuf->get_width();
}

Kdy pixbuf přejde mimo rozsah působnosti, provede se na pozadí unref() a dále se o něj již nemusíte starat. Nebylo zde žádné new, tak není ani žádné delete.

If you copy a RefPtr, for instance

auto pixbuf2 = pixbuf;
, or if you pass it as a method argument or a return type, then RefPtr will do any necessary referencing to ensure that the instance will not be destroyed until the last RefPtr has gone out of scope.

Podrobné informace o RefPtr viz dodatek.

If you wish to learn more about smartpointers, you might look in these books:

  • Bjarne Stroustrup, "The C++ Programming Language" Forth Edition - section 34.3
  • Nicolai M. Josuttis, "The C++ Standard Library" - section 4.2