У меня есть эта договоренность:C++ unique_ptr против друга класса частных деструктор
class LexedFile
{
friend class Lex;
//...
private:
~LexedFile();
};
class Lex
{
//...
private:
std::map<std::string, std::unique_ptr<LexedFile> > Files;
};
Lex является единственным создателем LexedFile
объектов и сохраняет право собственности на все LexedFile
объектов, которые она создает на карте. К сожалению, компилятор жалуется на это из-за правил видимости от переменной карты до деструктора LexedFile
. Я могу исправить эту проблему, сделав ~LexedFile()
общедоступной, но, конечно, причина, по которой я сделал это частным, - это усилить решение о том, что объекты этого типа принадлежат только объектам Lex
.
Мой вопрос: каковы мои переносные варианты для создания unique_ptr
счастливые и сохраняющие ~LexedFile()
приватные? По-моему, он, по-видимому, должен работать с последними версиями g ++ и последними версиями Visual C++.
я принял удар на вставляя что-то вроде:
friend class std::unique_ptr<LexedFile>;
, но даже если он работал (это не так) это своего рода казалось, опираясь на предположения о реализации, которые не могут быть портативными.
передать свой собственный Deleter вместо использования по умолчанию один :) –
'друг класс станд :: default_delete' может также, возможно, работать, в зависимости от реализации, но я бы не стал рассчитывать на нем, и он также, вероятно, раскрывает ваш деструктор больше, чем вы хотели бы его обнажить. –
Или даже лучше 'friend std :: unique_ptr :: deleter_type;' который также будет работать для 'std :: unique_ptr', который использует пользовательский Deleter. –