1 Востаннє редагувалося Yola (05.12.2015 08:41:43)

Тема: unique_ptr і базові класи

Маю такі класи:

    class World final
    {
    public:
        ...
        void AddShape(std::unique_ptr<Shape> shape);
    };

    class CubeSimulation : ...
    {
        ...
        World::Box *_box;
    };

У класі симуляції потрібно створити Box і передати його в Worod::AddShape.

Перша невдала спроба оскільки шаблони не коваріантни:

auto box_up = make_unique<World::Box>(halfExtents, identity);
_box = box_up.get();
_world->AddShape(box_up);

Можна так, але виглядає кострубато:

    auto box_up = make_unique<World::Box>(halfExtents, identity);
   _box = box_up.get();
   _world->AddShape(unique_ptr<World::Shape>(box_up.release()));

Можна так, але ж не хочеться мати new у програмі [1]

    _box = new World::Box(halfExtents, identity);
    _world->AddShape(unique_ptr<World::Shape>(_box));

Примітка:
static_pointer_cast - працює лише із shared_ptr. Може потрібно десь собі створити такий для unique_ptr і тримати серед допоміжного краму у проекті?

2

Re: unique_ptr і базові класи

Можете словами пояснити, що саме ви хочете зробити і нащо передаєте в AddShape саме unique_ptr? В момент передачі оригінал припиняє існувати, ви, звісно, в курсі - і те, що ви зберігаєте _box, нікому не допоможе.
Якщо я правильно розумію, ви хочете, щоб той екземпляр Shape, що передається в AddShape, автоматично припинив існування після роботи AddShape, так? Тоді, вочевидь, вам треба туди передавати копію _box, сам _box ви туди не передасьте таким чином. Може, вам все ж shared_ptr потрібен? Чи щось інше?

3

Re: unique_ptr і базові класи

У мене є об'єкт класу World, який є власником об'єктів підкласів Shape. Коли об'єкт класу World вмирає, то він убиває всі об'єкти власником яких він є.

Симуляція, створює світ, а потім наповнює його формами, коробками наприклад. Також симуляція зберігає у себе сирі вказівники на форми (коробки наприклад). Це винятково проблеми симуляції, якщо вона використає якийсь з цих вказівників після того як знищила світ.

Прихований текст

Поки писав зрозумів, що _world мусить бути стековим об'єктом, а не вказівником, тоді _world житиме до завершення деструктора симуляції і це більш убезпечить від використання завислих вказівників.

4 Востаннє редагувалося koala (05.12.2015 12:52:51)

Re: unique_ptr і базові класи

Так власник і має створювати об'єкти, інакше який він власник?

Подякували: Yola1

5

Re: unique_ptr і базові класи

koala написав:

Так власник і має створювати об'єкти, інакше який він власник?

Ну якщо вже на те пішло, то створювати має якась фабрика :)

Подякували: koala1