3 votes

C++ unique_ptr versus friend class private destructor

J'ai cet arrangement :

class LexedFile
    {
    friend class Lex;
//...
private:
    ~LexedFile();
    };

class Lex
    {
//...
private:
    std::map<std::string, std::unique_ptr<LexedFile> > Files;
    };

Une Lex est le seul créateur de LexedFile et conserve la propriété de tous les objets LexedFile les objets qu'il crée dans une carte. Malheureusement, le compilateur s'en plaint fortement en raison des règles de visibilité de la variable map à la variable LexedFile destructeur. Je peux résoudre ce problème en faisant ~LexedFile() public, mais bien sûr la raison pour laquelle je l'ai rendu privé est de renforcer la décision que les objets de ce type appartiennent seulement à Lex objets.

Ma question est la suivante : quelles sont mes options portables pour faire unique_ptr heureux et gardant toujours ~LexedFile() privé ? Par portable, je suppose qu'il doit au moins fonctionner avec la dernière version de g++ et la dernière version de Visual C++.

J'ai essayé d'insérer un truc du genre :

friend class std::unique_ptr<LexedFile>;

mais même si cela avait fonctionné (ce qui n'a pas été le cas), cela semblait reposer sur des hypothèses concernant l'implémentation qui pourraient ne pas être portables.

4voto

Stephen Lin Points 2322

Il suffit d'instancier std::unique_ptr avec votre propre suppresseur. Je pense que ça va marcher :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X