C ++ изменить частную переменную-член из статической функции-члена - PullRequest
4 голосов
/ 07 июля 2010

Я заметил, читая мой код, что у меня есть статическая функция-член, которая изменяет закрытый член своего класса через указатель на экземпляр указанного класса.

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

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

Ответы [ 2 ]

4 голосов
/ 07 июля 2010

Да, это действительно так.

Хотя нестатический член лучше в большинстве случаев, статические члены иногда используются в тех случаях, когда вам нужно передать указатель на функцию во внешнюю библиотеку, напримерв вашем случае для библиотеки 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 голосов
/ 07 июля 2010

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

...