Построение объектной системы вокруг shared_ptr - PullRequest
1 голос
/ 01 мая 2011

Я использую shared_ptr в качестве сборщика мусора для игрушечного языка, над которым я работаю, который компилируется в C ++. Мои объекты происходят из общего базового класса, описанного выше, что есть строки и числа, а также векторы и карты. Все на стороне c ++ передается в оболочке shared_ptr s, поэтому мои контейнеры на самом деле содержат shared_ptr, поэтому, когда они уничтожаются, их содержимое также уничтожается. Эта схема работает, но она выглядит немного странно в том, что контейнеры, являющиеся базовыми объектами, содержат shared_ptr s. Есть ли недостаток в моем дизайне? Если да, какова будет альтернативная иерархия вокруг этого подхода?

1 Ответ

1 голос
/ 01 мая 2011

Вот как я бы это настроил:

namespace toylang {

class Object;
// main handle type; use this for all object references
// replace with boost::intrusive_ptr or similar if too inefficient
typedef std::shared_ptr<Object> obj;

class Object
{
    // whatever
};

class Number : public Object
{
    int x;
    // etc
};

class Array : public Object
{
    std::vector<obj> a;
    // etc
}

Обратите внимание, что массивы ToyLang в этой схеме являются векторами указателей, предоставляя семантику эталонного языка. На самом деле это довольно часто встречается в динамических языках: Lisp, Python и другие работают так. Пока у вас нет циклических ссылок, подсчет ссылок shared_ptr обеспечит правильную сборку мусора.

...