2012-05-15 6 views
11

私は次のような難点に直面しています。私たちのソフトウェアは、アルゴリズムオブジェクトの抽象基本クラスを持っています。これらのすべてのオブジェクトは、例えば、一般的な​​方法を持っている:C++の一般的な(ほぼ)自己記述的なパラメータとGUIが結合されていますか?

class Algorithm 
{ 
public: 
    // [...] 
    virtual void execute() = 0; 
    // [...] 
}; 

を我々が実装したい各アルゴリズムのために、私たちは単に基本クラスから継承し、中央の場所にすべてのロードされたアルゴリズムのオブジェクトを格納します。ここまでは順調ですね。

問題はアルゴリズムのパラメータにあります。我々は、(外部クラスによって)設定する必要があるパラメータを各アルゴリズムについて記述することができるようにしたい。この目的のために、各アルゴリズムにそのパラメータを含むParameterListオブジェクトを与えました。私たちのために、パラメータは何らかの種類(例えば、int)とラベル(「繰り返し回数」)で構成されていることを明確にする必要があります。ParameterListを何らかの種類私たちが使っているグラフィカルなAPI(QtやGTKなど)は、私たちのアルゴリズムには「知識」がないはずですが、同じ側面では、アルゴリズムのパラメータを意味的に記述できるようにしたいとします。アルゴリズムは、このファイル名が、その後どのように表示されるかファイル名を。必要とすることを指定することで、GUIまでです。

このを結合する方法はあります何らかの意味論的タイプの知識を持つ210?

この質問は非常に曖昧に聞こえます。しかし、私はNDAの理由から、自明ではないコード例を掲載することは許可されていません。だから、過去に似たような問題に直面した人はいますか?

まとめ:私たちのオブジェクトは、GUIの正確な詳細を知らなくても、GUIに必要なパラメータを記述することができます。

+1

OK、*は良い質問です。そして新しいポスターからも。結局のところ、希望がある。 –

+0

タイプごとに必要なパラメータと情報のリストを提供する各アルゴリズムクラスに実装された別の仮想メソッド(ファイル名 - >次にオープンファイルボタン、整数 - >スピンボタンなどのテキストフィールド) ... GUIは、実行されるalgoのために表示するパラメータを要求します...なぜそうではありませんか? – ShinTakezou

答えて

9

ここでは、ビジターパターンを使用するオプションが1つあります。あなたは、このように基本クラスを作成することができます。

class Parameter { 
public: 
    virtual ~Parameter() {} // Polymorphic classes need virtual dtors. 

    virtual void accept(ParameterVisitor& v) = 0; 
}; 

あなたはこれらのようなサブクラスを定義することができます。各acceptメンバ関数では、*thisのタイプは、クラスの静的な型であることを

class IntParameter: public Parameter { 
public: 
    virtual void accept(ParameterVisitor& v) { 
      v.visit(*this); 
    } 
}; 
class FilenameParameter: public Parameter { 
public: 
    virtual void accept(ParameterVisitor& v) { 
      v.visit(*this); 
    } 
}; 

注 - 第1の場合はIntParameter&、第2の場合はFilenameParameter&である。

あなたは、このような基底クラスParameterVisitorクラスを定義することができます:あなたはその後、型情報を取り戻すために、この訪問者をサブクラス化することができます

class ParameterVisitor { 
public: 
    virtual ~ParameterVisitor() {} // Polymorphic classes need virtual dtors. 

    virtual void visit(IntParameter& p) {} 
    virtual void visit(FilenameParameter& p) {} 
    /* .. etc. .. */ 
}; 

を:

class Gui1ParameterVisitor: public ParameterVisitor { 
public: 
    virtual void visit(IntParameter& p) { 
     /* ... use GUI1 to create a field for an integer. */ 
    } 
    virtual void visit(FilenameParameter& p) { 
     /* ... use GUI1 to create a field for a filename. */ 
    } 
}; 

class Gui2ParameterVisitor: public ParameterVisitor { 
public: 
    virtual void visit(IntParameter& p) { 
     /* ... use GUI2 to create a field for an integer. */ 
    } 
    virtual void visit(FilenameParameter& p) { 
     /* ... use GUI2 to create a field for a filename. */ 
    } 
}; 

あなたParameterListクラスは、単に保存することができますParameter*のリストその後、適切なビジタータイプをインスタンス化し、そのvisitコールバックがすべてのウィジェット構築を行うようにGUIを構築できます。これにより、型保証され、必要な情報が復元されます。新しいパラメータ型を作成するたびにParameterVisitorクラスに新しいメンバ関数visitを追加する必要がありますが、すべてのGUIビルドを行うにはそれを行う必要があります。

希望すると便利です。

+0

これは興味深いですが、それは過度に複雑ではありませんか? GUIが必要なインタフェースを抽出する可能性のあるタイプを記述する、各パラメータについての非常に単純なメタ情報ではないのはなぜですか? GUIのための "ffi"のようなもの...または類似のもの – ShinTakezou

+1

メタ情報の問題は、すべてを総称して扱うために、 "これがintフィールドの場合は、フォームのコードを追加する必要があります。ウィジェットを作成する、ここであなたはウィジェットなどを解釈する方法です。 "上記のアプローチは、キャ​​スティングを必要としないタイプセーフな方法でこれを行います。 – templatetypedef

+0

ああ、もちろん、GUIで選択した値をオブジェクトに戻す「フィードバック」部分がありません。さて、私はそれを参照してください: – ShinTakezou

関連する問題