2

このようなクラスを作成します

class myClass {

public:  
 int addMeOne; 
 void Invoked()  { .... }
};

私はそのオブジェクトを作成し、それを参照によってプログラムの他のすべてのモジュールに送信するために使用しました。誰もがaddMeOne変数を1ずつインクリメントするために使用されていました。2回追加することもありましたが、それは重要ではありません。

これにより、誰かがaddMeOneを変更するたびに、関数Invoked()が呼び出されるようになります。

正しい戦略は、addMeOneを何らかの関数によって外部に公開し、その関数の内部でInvokedを呼び出すことを許可する必要があることに注意してください。ただし、これは他のすべてに公開されており、変更する必要がないため、インターフェイスを変更することはできません。どうすればこれを修正できますか。?

4

5 に答える 5

0

変数に値を割り当てるメソッドを作成する必要がありaddMeOneます。これはセッターメソッドと呼ばれ、変数自体をプライベートにします。

整数変数を変更したときに関数をトリガーする方法はないと思います。

インターフェイスを変更するが、外部のコードを変更する必要がない1つの代替方法は、整数の動作を模倣するクラス、つまり実装operator++などを定義し、addMeOneこのタイプに変更することです。

于 2012-08-30T14:30:07.107 に答える
0

このクラスの ABI を保持する必要がありますか?それとも、そのクライアントが使用する構文だけを保持する必要がありますか? の型を変更したり、addMeOne書き込み機能を維持したりaddMeOne++できる場合は、クラスとそれに関連する演算子を定義してaddMeOneから、このクラスのインスタンスにすることができます。確かに、オペレーターは、いくつかのメンバー関数addMeOneの呼び出しを含め、何でもできるようになりました。MyClass

疑似コード:

class Proxy
{
public:
  Proxy(YourClass *parent) : parent_(parent), value_(0)
  {}
  void operator++() 
  {
    ++value_;
    // doAnything with parent_
  }
  // accessors, cast operators etc...
private:
  YourClass *parent_;
  int value_;
};

class YourClass
{
public:
  YourClass() : addMeOne(this)
  {}
  Proxy addMeOne;
};
于 2012-08-30T14:33:38.103 に答える
0

実際、パブリック変数の代わりにメソッドを使用するようにすべてのクライアントに指示することはおそらく価値があります。クラス、クライアント、またはその両方を変更する必要があります。

それを回避する方法はありません。もう一度やり直してください。ヒットを取る。

トリックがあります: メンバー変数を公開したら、できることの 1 つはint addMeOne、同じ名前で型が異なる別の変数に置き換えることです。countedint addMeOne. intのcountedintように動作するように記述しなければならないクラスですが、割り当て、インクリメントなどもそれらが使用された回数をカウントします。例えば

countedint & operator ++(){
   m_value++;
   m_number_of_uses++;
   return *this;
}
countedint & operator --(){
   m_value--;
   m_number_of_uses++;
   return *this;
}

おそらく int へのキャスト演算子も必要であり、そこでの使用回数も数えることができます。

于 2012-08-30T14:32:36.340 に答える
0

カプセル化について読む必要があります。ロックダウンされた getter/setter インターフェースを に提供しaddMeOnないと、その使用に対する制御を保証する方法がありません。

インターフェイスの変更を恐れないでください。それを使用している人にとって、変更することは大きな仕事ではなく、変更することであなたがしていることは、彼らの利益のために価値を提供することであることを明確にする必要があります.

于 2012-08-30T14:32:07.200 に答える
0

使用するaddMeOneとプロキシに変わる可能性があります。

class myClass 
{
    class addMeOneProxy
    {
        public:
            addMeOneProxy(myClass &s) : parent(s) {}

            // This gets called whenever something tries to use the addMeOne 
            // member variable as an integer.
            operator int() const 
            {
                return parent.addMeOne;
            }

            // This gets called whenever something assigns a value to addMeOne.
            int operator=(int val) 
            {
                parent.Invoked(); 
                return val;
            }

            // You could also implement an operator++ or whatever else you need.

        private:
            myClass &parent;
    };

  public:
    void Invoked();
    addMeOneProxy addMeOne;
};

もちろん、ある時点で Invoked() を非公開にする場合は、myClass を addMeOneProxy のフレンド クラスにして、addMeOneProxy が Invoked メンバー関数を呼び出せるようにする必要があります。

私は確かに、これにはゲッター関数とセッター関数が必要であるという他のコメンターに同意しますが、開発者が自分の住んでいる世界を制御および変更する権限が限られていることが多いことも理解しています。あなたは世界を変えることはできませんし、許可されていません。

于 2012-08-30T14:38:09.017 に答える