Умные указатели, предварительная декларация и C4150 - PullRequest
3 голосов
/ 23 января 2011

Итак, в рамках большого хобби-проекта обучения я реализовал в основном полную реализацию интеллектуального указателя. Он выполняет практически все, о чем я прошу, за исключением одной незначительной детали, которая может оказаться нарушителем, если я не смогу ее решить. Придуманный пример:

//Header1.h

#include <Header2.h>

class A
{
//Methods and such that involve class B in return type / arguments
};

//Header2.h

class A; //Forward declaration of A, needed because A includes Header2.h

class B
{
public:
    SmartPointer<A> Ptr;
};

Предыдущий код, как вы могли догадаться, дает мне warning C4150: deletion of pointer to incomplete type 'type'; no destructor called. Я знаю, почему это происходит; в Header2.h код интеллектуального указателя включает в себя удаление в объявленном вперед экземпляре A. Если бы я мог включить Header1.h, нет проблем. Я действительно не хочу рефакторинга на этом этапе.

Я слышал, что умный указатель наддува как-то решил эту проблему. Внедрение поддержки не является целью этого проекта, так как это в значительной степени хобби / учебный проект. Так как же Boost справиться с этой проблемой? Как я мог заставить умный указатель вести себя, в этом случае, как необработанный указатель? У меня есть несколько идей, но я подумала, что вопрос можно перенести в SO, чтобы свести список идей в полезное подмножество.

Вперед, спасибо за помощь в решении этой проблемы.

Ответы [ 2 ]

2 голосов
/ 23 января 2011

Так как же Boost справляется с этой проблемой?

Boost решает эту проблему, используя checked_delete вместо delete в шаблоне класса интеллектуального указателя, что требует полного определения A.

1 голос
/ 23 января 2011

Boost поддерживает указатель на функцию, которую можно использовать для удаления объекта. Это сохраняет это в объекте указателя вместе с фактическим указателем. Вы можете передать свой собственный деструктор, если хотите сделать что-то еще, кроме вызова delete.

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

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