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++と最新のVisualC++で動作する必要があると思います。

私は次のようなものを挿入することに突き刺しました:

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 に答える