IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Classe entièrement privée


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    Par défaut Classe entièrement privée
    Je suis en train de m'arracher les cheveux à comprendre le code d'un autre développeur.
    Il a définit une classe ou tout est privé, si bien qu'on ne peut rien à faire, ni l'instancier, ni en appeler une méthode. Je ne vois pas bien l'intérêt d'une telle classe... Il semble bien qu'il s'agisse d'un singleton, géré par un "smart pointer" qui compte le nombre de références.

    Pour être plus clair, voici ce que j'ai:

    1) La classe de pointeur intelligent (que j'ai réussi à comprendre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    template <class T> class SmartPtr
    {
    public:
    	SmartPtr();
    	SmartPtr(T* ptr);
    	SmartPtr(const SmartPtr<T>& reference);
    	~SmartPtr();
     
    	T* operator->() const;
    	T& operator*() const;
    	operator const T*() const;
    	operator T*() const;
    	operator const void*() const;
    	operator void*() const;
     
    	SmartPtr<T>& operator=(const SmartPtr<T>& reference)
    	SmartPtr<T>& operator=(T* ptr);
     
    	// Manipulation du compteur de références
    	SINT32 AddReference();
    	SINT32 Release();
    	SINT32 GetReferenceCount() const;
     
     
    protected:
    	T* myPointer;
    };
    2) La fameuse classe entièrement privée (simplifiée bien sûr)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class MyClass
    {
    	static void* operator new(unsigned int);
    	static void operator delete(void*);
    	static class SmartPtr<MyClass> New();
     
    	int AddReference();
    	int Release();
    	int GetReferenceCount();
    	//
    	// Autres méthodes...
    	//
    	MyClass(class MyClass&);
    	MyClass();
     
    	virtual ~MyClass();
    	virtual class SmartPtr<MyClass> Clone();
    };
    Comme ni public, ni protected, ni private n'est précisé, c'est "private" qui est pris par défaut.
    Il y a bien une méthode static qui semble être là pour créer une nouvelle instance, mais comme elle est privée, elle est inaccessible.

    Par ailleurs, j'ai accès de façon globale à une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class SmartPtr<MyClass>  MyClass_New();
    Mais là encore, je ne peux pas l'utiliser car le compilo n'est pas content, il dit que le destructeur de "MyClass" n'est pas accessible.

    Donc je nage... Si quelqu'un peut m'expliquer comment instancier "MyClass", ou mieux, comment exploiter l'instance existante, je suis preneur.

    Merci !!
    Eric

  2. #2
    Membre habitué
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    Ca a aucune intérêt car comme tu le dis, on ne peut pas l'utilisée. C'est à se demander comment une telle classe a peu être tout au moins tester...

    Sauf si tout est gérer par le constructeur et le destructeur??? faudrait voir l'implémentation pour être sur.

    EDIT: constructeur et destructeur est aussi private donc ca ne peux pas compiler non plus. doit juste manquer le mot clé public quelque part.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il n'y a pas un "friend" quelque part ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    Par défaut
    Aurélien,
    C'est bien ce que je pensais, il doit bien manquer un public quelque part, et pourtant ça compile. Mais je n'ai que les .h, je n'ai pas le code source complet.

    Loic,
    Ta question est intéressante. Je ne vois de friend nul part (j'ai pourtant cherché...) Mais est-ce que je pourrais créer une classe friend de MyClass pour accéder aux membres privés?

    (en presque 20 ans de C++, je n'ai JAMAIS utilisé le mot-clé "Friend"...)

    Merci de votre aide en tout cas !!
    Eric

  5. #5
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Citation Envoyé par eric_marciano Voir le message
    Mais est-ce que je pourrais créer une classe friend de MyClass pour accéder aux membres privés?
    Oui. Une classe/fonction amie peut accéder à tout.

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    de toute évidence, ça ressemble à une classe destinée à être mère: on voit d'ailleurs des fonctions virtuelles.Cela signifie donc que pour utiliser cette classe, tu doit le faire au travers d'une classe fille.

    Cette classe me parait donc tout à fait correcte , elle nécessite juste un héritage.


    Bonne chance

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par eric_marciano Voir le message
    Ta question est intéressante. Je ne vois de friend nul part (j'ai pourtant cherché...) Mais est-ce que je pourrais créer une classe friend de MyClass pour accéder aux membres privés?
    Pas sans modifier la définition de MyClass. Plus le temps passe, plus je me demande, comme Luc, s'il n'y a pas un hack à l'aide de #define class struct qui traîne dans le .cpp qui visiblement ne t'est pas fourni.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il n'y a pas un "friend" quelque part ?
    S'il était quelque part, il serait dans la définition de MyClass. Une autre classe ne peut pas se déclarer arbitrairement amie de celle-ci (heureusement !).

  9. #9
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    J'ai l'impression qu'il s'agit d'une classe prévue pour se dupliquer, se détruire elle-même, mais à condition d'en avoir déjà une instance (une "graine"), qui viendrait d'ailleurs (un void * renvoyé d'une fonction, par exemple). Protection anti-copie ?

  10. #10
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    Par défaut
    Citation Envoyé par 10_GOTO_10 Voir le message
    J'ai l'impression qu'il s'agit d'une classe prévue pour se dupliquer, se détruire elle-même, mais à condition d'en avoir déjà une instance (une "graine"), qui viendrait d'ailleurs (un void * renvoyé d'une fonction, par exemple). Protection anti-copie ?
    Oui, j'ai ça sur une autre classe du même type, une fonction globale du type:
    void* get_MyClassInstance();

    Le nom de la fonction en question est suffisamment explicite pour voir qu'elle est bien censée retourner une instance de ma classe mystérieuse.
    Je ne sais pas comment l'utiliser, mais je sens qu'on est près du but.

    Merci encore à tous pour votre aide !!

    Eric

    [EDIT] J'ai fait un nouvel essai: j'appelle la fonction, je récupère un void*, je le cast en "MyClass*" et j'essaie d'appeler une méthode de la classe. Bien sûr, ça ne marche pas car toutes les méthodes sont private...

  11. #11
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par 10_GOTO_10 Voir le message
    J'ai l'impression qu'il s'agit d'une classe prévue pour se dupliquer, se détruire elle-même, mais à condition d'en avoir déjà une instance (une "graine"), qui viendrait d'ailleurs (un void * renvoyé d'une fonction, par exemple). Protection anti-copie ?
    Oui, mais il y a un problème: même en supposant que la classe soit instanciée dans un autre process, elle ne pourrais pas être recopiée sans au minimum un constructeur de copie public....

    Sinon, une possibilité serait qu'elle soit juste déclarée pour être pointée par le process qui ne l'instancierais pas et qui se contenterais de manipuler son pointeur. le problème est que dans ce cas, un simple class MyClass; suffirait...

Discussions similaires

  1. classe déclarée privée
    Par new_wave dans le forum Langage
    Réponses: 7
    Dernier message: 28/04/2008, 23h04
  2. [Classe avec fstream] Accès à chaîne privée
    Par Jean_Benoit dans le forum SL & STL
    Réponses: 3
    Dernier message: 12/10/2006, 12h24
  3. classe privée dans un paquetage
    Par volontier dans le forum Langage
    Réponses: 3
    Dernier message: 17/06/2006, 01h32
  4. Classe privée et variables globales
    Par mavina dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 21/04/2006, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo