0

私は自分の OpenGL アプリケーション用の UI システムを作成していて、このデザインを持っています...

UI マネージャー:

class UIManager {
public:
  UIElement *add(UIElement *element);
}

要素の例:

class Button : public UIElement {
public:
  Button(UIElement *parent, const string &caption, const Point &position);
}

ボタンをインスタンス化してポインタを保持したいときはいつでも、次のように書く必要があります。

// somewhere in the header file
UIManager *manager;
Button *button1, *button2;

// in cpp
button1 = static_cast<Button *>(manager->add(new Button(0, "Enter", Point(10, 10))));
button2 = static_cast<Button *>(manager->add(new Button(0, "Exit", Point(10, 50))));

これは、特に多数の要素がある場合は、少し長く見えます。

これはデザインが悪いのでしょうか?これを乗り越える別の方法はありますか?

4

3 に答える 3

2

追加する引数内の変数にボタンを割り当てることができます。

// somewhere in the header file
UIManager *manager;
Button *button1, button2;

manager->add(button1 = new Button(0, "Enter", Point(10, 10)));
manager->add(button2 = new Button(0, "Exit", Point(10, 50)));

また、返された引数を add メソッドから削除します。

于 2012-08-30T05:07:17.980 に答える
2

addテンプレート メソッドとして宣言し、すべてのキャストを回避できます。

class UIManager {
public:
    template<typename T> 
    T* add(T *element) {
      // do something with element
      return element;
    }
}

次に、クライアントコードは次のようになります

button1 = manager->add(new Button(0, "Enter", Point(10, 10)));
于 2012-08-30T11:16:37.273 に答える
0

addメソッドをメソッド テンプレートとして宣言し、実際のメソッドに転送します。

class UIManager {
public:
    UIElement *add(UIElement *element);
    template<typename T> T *add(T *element) {
        return static_cast<T *>(add(static_cast<UIElement *>(element))); }
}

Button *button1 = manager->add(new Button(0, "Enter", Point(10, 10)));

生のポインターの代わりに、マネージド ポインター (unique_ptrまたは、この場合はshared_ptr) を使用する必要があることに注意してください。

于 2012-08-30T07:37:52.587 に答える