2010-07-10 5 views
3

Voici le code:Comment rendre ma classe privée visible pour les conteneurs STD?

#include <map> 
class Hidden { 
private: 
    friend class Visible; 
    Hidden(); { /* nothing */ } 
}; 
class Visible { 
public: 
    void f() { 
    std::map<int, Hidden> m; 
    m[1] = Hidden(); // compilation error, class Hidden is private 
    } 
}; 

Le code ne compile pas parce que le constructeur de la classe Hidden est privée pour la classe std::map. Évidemment, je ne veux pas faire de la classe std::map un ami de Hidden. Mais que dois-je faire ici? Merci d'avance!

+4

"Que faites-vous * * ici?" est la bonne question. Quel est le but du code? Et il n'y a pas moyen de contourner cela: 'map' doit être capable de construire' Hidden'. – GManNickG

Répondre

2

Ajouter la carte en tant que classe d'ami:

#include <map> 
class Hidden { 
private: 
    friend class Visible; 
    friend class std::map<int, Hidden> ; 
    Hidden() {} 
}; 
class Visible { 
public: 
    void f() { 
    std::map<int, Hidden> m; 
    m[1] = Hidden(); // compilation error, class Hidden is private 
    } 
}; 

Bien sûr, cela signifie que vous devez déclarer tous les utilisateurs cachés à l'intérieur caché, mais c'est exactement le point du motif « private class » que vous utilisez

+0

@aaa: Je n'ai pas déclaré le modèle de carte en tant qu'ami. Seulement son instanciation comme une carte de [int, Hidden]. Donc, il n'y a pas de problème de portabilité. – paercebal

0

Pour votre classe Cachée, map est juste une autre classe et à moins que vous ne fassiez explicitement de map un ami de Hidden, cette map ne pourra pas accéder au constructeur de Hidden.

L'approche donnée par paercebal doit fonctionner car il fait de la carte l'ami de votre classe Caché.

Questions connexes