1

mainプログラムから初期化し、コンストラクターでパラメーターを指定する形状クラスがあります。

Shape *cusomShape = new CustomShape(float radius, float origin)

shape クラスには、ロールオーバーなどの機能があります。shape クラス内のロールオーバー関数が発火したときに、プログラム内の特定の値
を変更したいと考えています。これは、ロールオーバー関数が発生したときに値を変更するイベントの発生に似ているかもしれませんが、C++ でそれを行う方法がわかりません。ここでイベントが理想的なアプローチであるとすれば、短い例が来るのを見るのは素晴らしいことです.intmain

イベントの使用が正しくない場合、これを行う理想的な方法は何ですか?

4

3 に答える 3

3

必要なのは、Shape の関数へのポインターまたは参照によって値を渡し、それを変更することだと思います。関数がメインからではなく別の場所から呼び出される場合は、ポインターを渡す方が適切なオプションです。最初にポインタをクラスに渡し、別のメソッドを使用して格納してから、ロールオーバーが呼び出されるたびにそれを利用します。

編集: 例:

class CustomShape {

void storePointer(int* _value) {
  value = _value;
}

void rollover() {
  .. do stuff
  *value++; // for instance
  ... do stuff
}
int * value;
}


int main() {
  int a;

  CustomShape cs;
  cs.storePointer(&a);

  ....
  cs.rollover();
  ....
  return 0;
}
于 2013-01-09T09:05:45.810 に答える
2

コンストラクターで変数への参照を渡し、その参照を保存します。必要に応じて値を変更してください。

于 2013-01-09T09:06:16.320 に答える
0

変数への参照を、その値を変更する必要があるメンバー関数に渡すことをお勧めします。クラスに参照を格納すると、Shape クラスが参照に結合されます。これは、整数を更新せずに Shape を使用するたびに使用できないことを意味します。これは、Shape コンストラクターが int への参照/ポインターを引数として期待するためです (Shape クラスはポインター/参照を属性として格納します)。 . メンバー関数への参照/ポインターを渡すと、Low Couplingが促進されます。

#include <iostream>

class Shape
{
    double shapeValue_;

    public: 
        Shape (double value)
            : 
                shapeValue_(value)
        {}

        void fireFunction(int& updateMe)
        {
            updateMe = 123;
        }
};

using namespace std;

int main() 
{
    int update; 

    cout << update << endl;

    Shape s(4.5); 

    s.fireFunction(update); 

    cout << update << endl;

    return 0; 
}; 

この場合、fireFunction のシェイプ オブジェクト呼び出しを含まないメイン プログラムのオプションがあります。

int main()
{
    Shape s(4.5); 

    // Main program that doesn't use fireFunction.

    return 0;
};

この場合、入力引数を変更するメンバー関数がある場合は、そのような関数を定義するためのスタイルを取る必要があります。たとえば、メンバー関数によって変更される変数が、常にその宣言の最初の入力引数であることを確認してください。

複雑なオブジェクトが相互に更新をやり取りしたい場合は、オブザーバー パターンを利用できます。

于 2013-01-09T09:19:25.960 に答える