2011-01-23 3 views
3

Таким образом, в рамках большого проекта обучения хобби я реализовал реализацию в основном полной реализации интеллектуальных указателей. Он делает практически все, о чем я прошу об этом, за исключением одной мелкой детали, которая может оказаться нарушителем сделки, если я не смогу ее решить. Надуманный пример:Умные указатели, форвардная декларация и C4150

//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 мог отбросить список идей в полезное подмножество.

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

+0

связанный: [удалить объекты неполного типа] (http://stackoverflow.com/questions/4325154/) – fredoverflow

ответ

2

Так как же повысить эффективность этой проблемы?

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

+0

Итак ... он решает его, превратив предупреждение в сообщение об ошибке? – James

+2

@James: Точно. Другого «решения» нет, см. Вопрос, который я связал как комментарий к вашему вопросу. – fredoverflow

+0

Похоже, мне может понадобиться реализовать указатель «Слабый». – James

1

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

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

Смежные вопросы