2010-07-07 4 views
4

Я заметил при чтении через свой код, что у меня есть статическая функция-член, которая изменяет частный член своего класса с помощью указателя на экземпляр указанного класса.C++ alter private member variable from static member function

Он компилируется и функционирует без проблем, но я просто хотел знать, было ли это кошерным редактировать частную переменную таким образом, от элемента, но статической функции, или если я должен внедрять публичную функцию setVar.

Обратите внимание, что я не пытаюсь обойти стандартную практику кодирования, редактируя переменные-члены из статической функции - функция обязательно статична, поэтому ее можно запускать как поток, используя библиотеку POSIX pthread.

Приветствия, Wyatt

+1

Да, это нормально. – 2010-07-07 09:42:29

ответ

4

Да, это верно.

Хотя в большинстве случаев наличие нестатического элемента лучше, статические члены иногда используются в случаях, когда вам нужно передать указатель на внешнюю библиотеку, например, в вашем случае для библиотеки pthread.

Если это имеет смысл, чтобы изменить эту приватную переменную в других ситуациях, и если вы хотите, чтобы отделить свой класс от того, что он использует библиотеку PTHREAD, вы могли бы разделить класс на две части:

  • один класс, который обрабатывает функциональность (например, ваш класс сейчас)
  • один класс, который обрабатывает взаимодействия с PTHREAD

второй класс затем установит переменную в первом классе с помощью открытого метода.

Пример: это, вероятно, ваш исходный код:

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

и это, как вы можете написать это:

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

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

Таким образом, вы полностью отделить свой класс от того, что он используется библиотекой PThread. Это делает его пригодным для использования и в других случаях (где статический метод довольно бессмыслен), а также легко добавить еще одну библиотеку потоков (например, потоки Windows), не загрязняя исходный класс.

0

Да. private означает, что доступ ограничен классом.