1

GUI を設計していますが、dynamic_casting を避けることができないため、問題があります。

私のクラス:

  class Widget; //base class for all widgets

  class Container //contains widgets
  {
     std::map<std::string, Widget*> m_widgets;
     public:
     template <class T> T* get(const std::string &name)
     {
         return dynamic_cast<T*>(m_widgets.at(name)); //I need casting here
     }
   }

動的キャストを回避するにはどうすればよいですか? GUI はユーザー定義のウィジェットで動作する必要があるため、ウィジェットの種類ごとにコンテナーを用意する余裕はありません。また、ユーザーが自分でウィジェットを保存する必要がないように、すべてのウィジェットにコンテナーが必要です。

なぜキャストが必要なのですか?

 class TextBox : public Widget
 { 
      public:
      std::string getText(); //I can't have it in Widget class, because it's object-specific
      //also, my gui must work with user-defined widgets so I can't provide 
      //empty virtual functions for everything in Widget
 }
4

4 に答える 4

1

RTTIは悪いので避けるべきだとどこでも読んだ

それは純粋なでたらめなので、どこでも読んでいるとは思えません。

RTTI は非常に優れた機能です。ただし、さらに優れたツールが利用可能な場合は、絶対に避けるべきです。優れた階層は、仮想関数を介して基本クラス インターフェイスにアクセスするだけで使用できるように設計されています。そのような場合、キャストは必要ありません。仮想関数を呼び出すだけで、正しいことが行われます。

あなたの GetText でさえ、デフォルトの実装が空の文字列を返す公正な候補かもしれません。おそらく、実際のテキストの存在を報告する機能クエリ機能と一緒に。そのため、ほとんどのクライアントは end を呼び出して空の文字列に満足するだけで済み、他のクライアントがチェックを行う可能性があります。

また、具体的なクラスだけの珍しいインターフェイスに興味がある人は、dynamic_cast を呼び出すことができます。コレクションはシンプルに保ち、コレクションに限定することをお勧めします。おそらく、本当に一般的な Widget ファミリにいくつかの特別なフォームを追加することになるでしょう。

于 2013-06-29T12:50:30.220 に答える