4

コードを読んでいるときに、そのクラスのインスタンスへのポインターを介してそのクラスのプライベートメンバーを変更する静的メンバー関数があることに気付きました。

コンパイルして問題なく機能しますが、この方法でプライベート変数を編集するのがコーシャーであるかどうか、メンバーであるが静的関数からかどうか、またはパブリック setVar 関数を実装する必要があるかどうかを知りたかっただけです。

静的関数からメンバー変数を編集することで標準的なコーディング手法を回避しようとしているわけではないことに注意してください。関数は必ず静的であるため、POSIX pthread ライブラリを使用してスレッドとして実行できます。

乾杯、ワイアット

4

2 に答える 2

4

はい、これは有効です。

ほとんどの場合、非静的メンバーを使用する方が適切ですが、pthreadライブラリの場合のように、関数ポインタを外部ライブラリに渡す必要がある場合に静的メンバーが使用されることがあります。

他の状況でもこのプライベート変数を変更することが理にかなっており、クラスをpthreadライブラリを使用するという事実から分離したい場合は、クラスを2つに分割できます。

  • 機能を処理する1つのクラス(現在のクラスのように)
  • pthreadへのインターフェースを処理する1つのクラス

次に、2番目のクラスは、パブリックメソッドを介して最初のクラスに変数を設定します。

例:これはおそらく元のコードです:

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スレッドなど)を簡単に追加することもできます。

于 2010-07-07T09:54:23.897 に答える
0

はい。privateアクセスがクラスに制限されていることを意味します。

于 2010-07-07T12:44:32.663 に答える