3

我有这样的安排:

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>;

但即使它有效(它没有)它似乎有点依赖于可能不可移植的实现的假设。

4

1 回答 1

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;
};
于 2013-03-04T01:32:53.613 回答