3

私はあなたからデザインの提案をしたいと思います。

私は C++ で一連のクラスを持っています。すべてのクラスには、実装するアルゴリズムの動作を決定する一連の変数 (doubleおよび) があります。int

このようなもの:

class Foo
{
  private:
  double value1, value2, etc...;
  public: 
  void setOptions(double val1, double val2);
  /*
  and here other methods...
  */
};

class Bar
{
  private:
  double value1, value2, etc...;
  public: 
  void setOptions(double val1, double val2);
  /*
  and here other methods...
  */
};

これらすべてのオプション変数を単一のクラスにグループ化して、クラスのインスタンスでオプションの変数を動的に変更できるようにしたいと考えていますがvalue、初期化として変数にデフォルト値を与えたいと考えています。

オプション変数が異なり、すべてのクラスのコンパイル時にデフォルト値が設定されることを望みます。

私は次のアプローチを採用しました。

// Options.h
class Options
{
    public:
    Options();

    static struct FooOptions
    {
      static double option1;
      static double option2;
    } fooOptions;

    static struct BarOptions
    {
      static double option1;
      static double option2;
        // etcetera
    } barOptions;  
};

そして、クラスFooBarクラスで値Options::FooOptions::option1などを使用します。

ここでの問題は、これらの値を静的に初期化できないことです。私は.cppファイルの外で静的メンバーを初期化するのに慣れていますが、私の.cppでは

// Options.cpp
Options::FooOptions::option1 = 1.0;

次のコンパイラを取得します error: error: expected constructor, destructor, or type conversion before ‘=’ token

一方、コンストラクター内でそれらを初期化すると:

// Options.cpp
Options::Options()
{
    FooOptions::option1=1.0;
}

undefined referenceからアクセスしようとするとエラーが発生しますmain

ここでの問題は、ネストされた静的構造が 2 つあることだと思います。この種の設計に最適なソリューションは何でしょうか?

クラス内でアルゴリズムのパラメーターとして使用する値のコンテナーdoubleとしてのみ機能するクラスをどのように実装しますか?int

4

3 に答える 3

4
// Options.cpp
Options::FooOptions::option1 = 1.0;

不足している「ダブル」を追加します:-)

double Options::FooOptions::option1 = 1.0;

するべきです。

于 2012-07-03T08:34:50.547 に答える
1

はい、どうぞ:

// Options.h
class Options
{
    public:
    static struct FooOptions
    {
      FooOptions() : option1(0.0), option2(0.1) {};
      double option1;
      double option2;
    } fooOptions;
};

すべてのフィールドが静的であるため、クラスに構造体インスタンスは必要ありません。

于 2012-07-03T08:32:11.140 に答える
0

クラスを過剰に設計しているようです。簡単な方法は、これらのオプション データをプライベート メンバーとしてクラスに含め、パブリック セッター/ゲッターを提供することです。

コンストラクターにパラメーターを追加することで、既定の動作をカスタマイズできます。セッターとゲッターを追加することにより、動作を動的に、つまり実行時に更新できます。

class Options
{
  public:
    /* choice=1: fooOptions
     * choice=2: barOptions
     * ..
     */
    Options(int choice);
    void SetOptions(..);
    void GetOptions(..);

  private:
    double option1;
    double option2;
};
于 2012-07-03T08:41:51.487 に答える