Как предотвратить уничтожение объекта пользователем - PullRequest
0 голосов
/ 06 декабря 2010

Я хочу вернуть реализацию класса из функции. Функция находится в библиотеке. Я хочу, чтобы пользователь не мог уничтожить возвращаемые мной объекты. Как мне этого добиться?

РЕДАКТИРОВАТЬ: Пример.

Интерфейс с миром:

class Base
{
   public:
      virtual void foo() = 0;
};

Base* GetFoo();

Реализация - внутренняя:

class Bar : public Base
{
    public:
        void foo() { //Do something}
};

Base* GetFoo()
{
   return new Bar
}

Ответы [ 6 ]

8 голосов
/ 06 декабря 2010

Вы можете использовать частный деструктор и создать некоторый метод (release()), чтобы разрешить освобождение объекта контролируемым образом.

2 голосов
/ 06 декабря 2010

И чтобы ответить на ваш вопрос, поскольку вы производны от базы, поэтому вы не можете сделать базовый деструктор приватным.Вы можете достичь своей цели с помощью защищенного деструктора.

1 голос
/ 06 декабря 2010

Верните shared_ptr<Base> и сохраните копию указателя самостоятельно. Этот указатель будет поддерживать объект в живых, независимо от того, что пользователь будет делать со своим shared_ptr<Base>. Вы могли бы даже рассмотреть возможность возврата weak_ptr<Base> вместо этого, чтобы подчеркнуть, что время жизни объекта зависит только от ваших прихотей.

0 голосов
/ 06 декабря 2010

Если то, что вы return называете new объектом, то нет никаких причин, по которым вам нужно запретить пользователю delete его использовать.

Однако вы не должныНе оставляйте вопросов об ответственности за удаление.Вместо этого либо используйте интеллектуальный указатель для возврата значения, либо используйте полиморфный шаблон pImpl (в котором неполиморфная оболочка содержит интеллектуальный указатель на полиморфную реализацию - обычно это интеллектуальный указатель, который обеспечивает семантику значения, например this ) вместо того, чтобы просто возвращать производный экземпляр.

0 голосов
/ 06 декабря 2010

Вы не можете запретить пользователю вашей библиотеки стрелять себе в ногу во время чистки заряженного пистолета.Т.е., даже если вы вернете постоянную ссылку, вы можете взять у нее адрес, а затем delete.Поэтому вы должны сделать свой код стабильным даже в этой ситуации.

Частные деструкторы PS (@ nc3b) накладывают ограничения на дальнейшее использование класса (например, больше не локальных нединамических экземпляров), поэтому рассмотрите ихмудро.

0 голосов
/ 06 декабря 2010

Почему вы хотите это сделать? В любом случае пользователь должен получать копию возвращенного объекта, и он должен решать, выделять ли или освобождать копию.

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