我有这样的安排:
class LexedFile
{
friend class Lex;
//...
private:
~LexedFile();
};
class Lex
{
//...
private:
std::map<std::string, std::unique_ptr<LexedFile> > Files;
};
Lex是LexedFile
个对象的唯一创建者,并保留其在地图中创建的所有LexedFile
个对象的所有权。不幸的是,由于从map变量到LexedFile
析构函数的可见性规则,编译器对此抱怨很大。我可以通过公开~LexedFile()
来解决这个问题,但当然我将其设为私有的原因是为了强化该类型的对象仅属于Lex
个对象的决定。
我的问题是:我的便携式选项是什么让unique_ptr
感到高兴并且仍然保持~LexedFile()
私密?通过便携式,我想它必须至少使用最新的g ++和最新的Visual C ++。
我插入了类似的内容:
friend class std::unique_ptr<LexedFile>;
但即使它有效(它没有),它似乎依赖于对可能无法移植的实现的假设。
答案 0 :(得分:4)
使用您自己的删除器实例化std::unique_ptr
。我认为这会奏效:
class LexedFile
{
friend class Lex;
//...
private:
struct Deleter
{
void operator()(LexedFile *file) const
{
delete file;
}
};
~LexedFile();
};
class Lex
{
//...
private:
std::map<std::string, std::unique_ptr<LexedFile, LexedFile::Deleter>> Files;
};