2010-07-07 14 views
4

J'ai remarqué en lisant mon code que j'avais une fonction membre statique qui modifie un membre privé de sa classe via un pointeur vers une instance de cette classe. Il compile et fonctionne sans problème, mais je voulais juste savoir s'il était casher d'éditer une variable privée de cette façon, d'une fonction membre mais statique, ou si je devais implémenter une fonction publique setVar. Notez que je n'essaie pas de contourner la pratique de codage standard en éditant des variables membres à partir d'une fonction statique - la fonction est nécessairement statique afin qu'elle puisse être exécutée en tant que thread à l'aide de la bibliothèque pthread POSIX.C++ modifier la variable membre privé de la fonction membre statique

Cheers, Wyatt

+1

Oui, c'est parfaitement OK. –

Répondre

4

Oui, cela est valable. Bien qu'il soit préférable d'avoir un membre non statique dans la plupart des cas, les membres statiques sont parfois utilisés dans les cas où vous devez passer un pointeur de fonction à une bibliothèque externe, comme dans le cas de la bibliothèque pthread.

S'il est logique de modifier cette variable privée dans d'autres situations, et si vous voulez séparer votre classe du fait qu'il utilise la bibliothèque pthread, vous pouvez diviser la classe en deux:

  • une classe qui gère la fonctionnalité (comme votre classe maintenant)
  • une classe qui gère l'interface avec pTHREAD

la deuxième classe sera alors la variable dans la première classe par une méthode publique.

Exemple: ceci est probablement votre code d'origine:

class MyClass 
    { 
    public: 
     static void someMethod(MyClass *); 
    private: 
     type myMember; 
    }; 

et voici comment vous pouvez aussi écrire:

class MyClass 
    { 
    public: 
     void setMember(type value) {myMember = value; /* other other logic */} 
    private: 
     type myMember; 
    } 

class MyClassPThreadInterface 
    { 
    public: 
     static void someMethod(MyClass *myclass) {myclass->...();} 
    } 

De cette façon, vous séparer complètement votre classe du fait que est utilisé par la bibliothèque PThread. Il le rend également utilisable dans d'autres cas (où la méthode statique est plutôt inutile) et il est également facile d'ajouter une autre bibliothèque de threads (par exemple des threads Windows) sans polluer la classe d'origine.

0

Oui. private signifie que l'accès est restreint à la classe.