2009-03-27 6 views
5

私はクラスの階層を持っています。基本クラスは、ファイルからロード可能なチューニングパラメータを使用します(実行時に再ロード可能)。それぞれの派生クラスはいくつかの追加パラメータを追加することができます。私は、ベースのコンストラクタで正しくサイズのパラメータ配列を割り当てる方法を探しているので、派生クラスで割り当てを解除して再割り当てする必要はありません。 (パラメータは常に2つの要素を持っている)私はこのような何かを期待していたが、それは働いていない:派生クラスに基づくサイズのベースコンストラクタで配列を割り当てる方法は?

class Base 
    { static int nParms; 
    virtual int getNParms() { return nParms;} 
    float *parameters; 
    public: 
    Base() 
    { parameters= new float[this->getNParms()]; 
     parameters[0] = globalReloadableX; 
     parameters[1] = globalReloadableY; 
    } 
    }; 
    int Base::nParams =2; 

    class Derived : public Base 
    { static int nParms; 
    virtual int getNParms() { return nParms;} 
    public: 
    Derived() : Base() 
    { parameters[2] = globalReloadableZ; 
    } 
    } 
    int Derived::nParams =3; 

私はthis questionを見てきましたが、そこに解決策はかなり私のために動作しません。 Iはまた、パラメータを各クラスの規則的なアレイ作製を試みた:

class Base 
    { float parameters[2] 
    ... 
    class Derived : public Base 
    { float parameters[3] 
    ... 

をそれが由来は2つの別々の配列を有することができます。

アイデア?

答えて

5

基本クラスのコンストラクタで必要な配列サイズをパラメータとして渡すのはなぜですか?

(つまり、C++仮想関数がどのように動作するかであるため、仮想関数は、派生クラスを呼び出していない理由がある;。、概念的に派生クラスのコンストラクタが完了するまで、オブジェクトの型は依然として基底クラスである)

+0

なぜそうではありませんか?あまりにも明らかだ!時には私はちょうど詳細で包まれすぎてしまいます...理由の説明をありがとう。 – AShelly

+0

問題はありません、皆に起こります! –

2

サイズをパラメータにするのはどうですか?

class Base 
{ static int nParms; 
    virtual int getNParms() { return nParms;} 
    float *parameters; 
public: 
    Base(int n = nParams) 
    { parameters= new float[n]; 
    parameters[0] = globalRelodableX; 
    parameters[1] = globalRelodableY; 
    } 
}; 
int Base::nParams =2; 

class Derived : public Base 
{ static int nParms; 
    virtual int getNParms() { return nParms;} 
public: 
    Derived() : Base(nParams) 
    { parameters[2] = globalRelodableZ; 
    } 
} 
int Derived::nParams =3; 
2

なぜアレイを使用しますか? std :: vectorは、派生クラスで必要な数だけのパラメータを使用できるようにします。ベースには必要な数が分からない(または気にすることはありません)。

+0

それは良い点です。私は実際には他の場所でベクトルを使用しています。しかし、私はまだC言語の仕事の大部分を行っているので、私は機能を追加するときに私が知っているものに行く傾向があります... – AShelly

0

std :: mapの使用を検討します。それはベースで成長することができ、両方とも、他のものが使用するパラメータの数を気にしなくてもよい。キー/値のペアは、その数値インデックスを管理しやすくなりますが、それは明らかにアプリケーションに依存します。

0

私は何が必要なのかに応じて、EarwickerとSteveの回答が好きです。これらのオブジェクトの多くが作成され、頻繁に破棄される場合、最小限のメモリ割り当てが可能になり、Earwicker'sが優れています。しかし、これが通常「作成され、再作成されることはほとんどない」ものであれば、スティーブの答えに行くでしょう。マップは一般的に操作が簡単で、必要に応じて動的に成長しますが、このオブジェクトは何かが作られ、多く破壊されています。

2

他の人に示唆されているように、コンストラクタのパラメータにすることもできますが、サイズをパラメータとしてBaseクラスを作成することもできます。これには、ヒープ上に配列を配置する必要性を排除するなど、多くの利点があります。

template <size_t nParams> 
class Base 
{ 
    float parameters[nParams]; 
public: 
    Base() 
    { // could use a static_assert(nParams > 1) here... 
     parameters[0] = globalRelodableX; 
     parameters[1] = globalRelodableY; 
    } 
}; 

class Derived : public Base<3> // or whatever 
{ 
public: 
    Derived() 
    { parameters[2] = globalRelodableZ; } 
}; 
関連する問題