Как передать указатель из unique_ptr на другой объект и управлять продолжительностью жизни? - PullRequest
5 голосов
/ 28 октября 2019

Я уверен, что есть стандартный способ решения этой проблемы, но я не могу его найти.

У меня есть класс Processor, который управляет продолжительностью жизни всех объектов. Foo может иногда назначаться Bar. Но Bar нужно знать, когда Foo больше не доступен (был удален Processor). Как правильно достичь этого?

class Processor {
  private:
    vector<unique_ptr<Foo>> foos;
    vector<unique_ptr<Bar>> bars;
};

class Bar {
  public:
    void AssignFoo(Foo* foo){ cur_foo = foo; }
  private:
    Foo* cur_foo = nullptr;
};

Один из вариантов, который я могу придумать, - это иметь map в Processor, который отслеживает назначения, и иметь функцию RemoveFoo вBar но мне интересно, есть ли другой способ.

1 Ответ

5 голосов
/ 28 октября 2019

Один из способов сделать это - использовать std::shared_ptr и std::weak_ptr:

class Processor {
private:
    vector<std::shared_ptr<Foo>> foos;
    vector<std::unique_ptr<Bar>> bars;
};

class Bar {
public:
    void AssignFoo(const std::weak_ptr<Foo>& foo){ cur_foo = foo; }
private:
    bool FooIsValid() const {
        return !cur_foo.expired();
    }  

    std::weak_ptr<Foo> cur_foo;
};

РЕДАКТИРОВАТЬ: раньше пытались использовать unique_ptr и необработанные указатели, но с самого начала получилось неправильно, поэтому я удалилэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...