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

  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
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Même pas, il faudrait au moins des constructeurs protégés -- à moins d'un "#define class struct" qui traine quelque part.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    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.

  9. #9
    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 Luc Hermitte Voir le message
    Même pas, il faudrait au moins des constructeurs protégés -- à moins d'un "#define class struct" qui traine quelque part.
    Oups, oui, je suis complètement à coté... et je peux même pas mettre ça sur le compte de la fatigue (on est le 8 mai ). Bon, on va dire que j'étais trop détendu.

  10. #10
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    Par défaut
    En effet, l'héritage ne marche pas, j'ai déjà essayé.
    Quant au "#define class struct", ça signifierait qu'on essaierait de me faire croire que c'est une classe, alors qu'en fait c'est une structure, c'est bien ça?
    Mais dans ce cas, comment peut-on avoir des fonctions, et même des fonctions virtuelles?? On peut avoir ce genre de chose dans une struct?

    Je crois que non, mais j'attends peut-être les limites de mes connaissances...

    Eric

  11. #11
    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 !).

  12. #12
    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 ?

  13. #13
    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 dans ce cas, comment peut-on avoir des fonctions, et même des fonctions virtuelles?? On peut avoir ce genre de chose dans une struct?
    la seule différence entre les struct et les class en C++ est :
    Par défaut le contenu et l'héritage dans une class est private.
    Par défaut le contenu et l'héritage dans une struct est public.
    (plus un troisième détail)

    Voir http://cpp.developpez.com/faq/cpp/in...e_class_struct

  14. #14
    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 eric_marciano Voir le message
    En effet, l'héritage ne marche pas, j'ai déjà essayé.
    [...]
    Mais dans ce cas, comment peut-on avoir des fonctions, et même des fonctions virtuelles?? On peut avoir ce genre de chose dans une struct
    On peut, mais par contre, je me demande bien à quoi peuvent servir des fonctions virtuelles privées...

  15. #15
    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...

  16. #16
    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...

  17. #17
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Il est rigolo ce topic

    Ça va paraitre idiot, mais peut-être que cette classe ne sert à rien ?
    Peut-être que le type qui a développé ça était novice en C++ (en tout cas j'espère pour lui), d'où le symptomatique MyClass.
    Il aurait écrit cette classe pour se faire la main sur la surcharge de new. Une fois qu'il aurait saisi le fonctionnement, il aurait alors eu l'idée de rendre tous les membres de cette classe privés histoire de tester que le reste du code n'en faisait plus usage.
    Enfin, il aurait oublié de virer le reste de la classe.

    Citation Envoyé par Éric & Ramzy
    Nous n'avons pas d'autre explication.

    Plus sérieusement, tu devrais trouver un morceau du code dans le projet qui fait usage de cette classe. Fais une recherche globale.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  18. #18
    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
    Quant au "#define class struct", ça signifierait qu'on essaierait de me faire croire que c'est une classe, alors qu'en fait c'est une structure, c'est bien ça?
    Non, ça signifierait qu'on ferait croire à la moitié du programme que les fonctions sont publiques (car struct <=> class + public), alors qu'on dirait à une autre moitié du programme qu'elles sont privées. Bien entendu, tenir ce genre de discours schizophrénique à un compilateur n'est pas autorisé par le norme. Mais il y a des chances que ça passe avec pas mal de compilateurs. A noter que j'ai plutôt rencontré ce truc dans l'autre sens : L'utilisateur d'une classe qui voulait contourner les droits mis en place par l'auteur de la classe, plutôt que par l'auteur de la classe pour restreindre les accès, comme ça a peut-être l'air d'être le cas ici.
    Citation Envoyé par méphistopheles Voir le message
    On peut, mais par contre, je me demande bien à quoi peuvent servir des fonctions virtuelles privées...
    Elles sont très utiles. La quasi totalité de mes fonctions virtuelles sont privées. Les autres sont protected, ou public quand je fais du code à la va vite que je regrette systématiquement par la suite.
    Une fonction virtuelle privée ne peut pas être appelée par les classes dérivées, mais rien n'empêche les classes dérivées de la redéfinir. Pour plus de détails, recherche programmation par contrat sur ce forum, ou bien lis http://www.gotw.ca/publications/mill18.htm qui résume bien la situation.
    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.

  19. #19
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Soit il y a du code qui utilise cette classe (production ou test) et dans ce cas il suffit de regarder comment ça la manipule, soit il n'y en a pas et cette classe ne sert à rien dans le système existant.
    Code mort => poubelle sans l'ombre d'une hésitation !

    MAT.

  20. #20
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 25
    Par défaut
    Merci à tous.
    Avc toutes les informations que j'ai là, je devrais bien réussir à faire quelque chose, ou à conclure que je ne peux rien faire.
    Pour clarifier la situation, je précise que c'est moi qui ai renommé la class "MyClass" et que l'auteur n'est surement pas un débutant. En revanche, le logiciel qu'il a écrit est suffisamment ancien pour mélanger du C et du C++, c'est peut-être là l'explication. Je suis désolé de ne pas pouvoir en dire plus pour des raisons de confidentialité.

    Eric

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