【发布时间】:2013-02-18 01:00:59
【问题描述】:
我有这样的安排:
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>;
但即使它起作用了(它没有起作用),它似乎有点依赖于对可能不可移植的实现的假设。
【问题讨论】:
-
传递你自己的删除器而不是使用默认的:)
-
friend class std::default_delete<LexedFile>也可能工作,具体取决于实现,但我不会指望它,它也可能暴露你的析构函数而不是你希望它被暴露 -
或者更好的
friend std::unique_ptr<LexedFile>::deleter_type;,它也适用于使用自定义删除器的std::unique_ptr。
标签: c++ map destructor friend unique-ptr