0

私はモンテカルロオブジェクトクラスを構築しようとしていますが、関連するクラスを設計するための最良の方法について疑問に思っています。

オブジェクト(エンティティと呼ばれる)の構造には、名前、説明、およびいくつかの異なるタイプの配布タイプが含まれます。Normal、Fixed Integer、Triangleなど。Distributionクラスは、特定の分布のスーパークラスです(またはそうなる可能性があります)。普通。

ので、私は持っています

class Entity {
public:
  string name;
  Distribution* dsn; // superclass. Can this be done?
}

class Distribution {
   public:
   string Type;
   double Sample(void)=0; // To be implemented in subclasses, same function sig.
}

次に、実際の分布の例は次のようになります。

class NormalDistribution : public Distribution {
    public:
    setMean(double mean);
    setStdDeb(double stddev);
    double Sample(void);
}

FixedDistribtionもDistributionのサブクラスであり、さまざまなメソッドを実装します。もちろん、setWeights、setValues、およびSampleです。

私はこのようなコードを書きたいと思っていました

Entity* salesVolume = new Entity();
salesVolume->setDistribution(NORM);
salesVolume->dsn->setMean(3000.0:
salesVolume->dsn->setStdDev(500.0);

Entity* unitCost = new Entity();
unitCost->dsn->setWeights( .. vector of weights);
unitCost->dsn->setValues( .. vector of values) ;

それから

loop
   sv = salesVolume->sample();
   uc = unitCost->sample();
endloop

私がやりたいのは、EntityでDistribution(スーパークラス)を定義してから、配布タイプによって異なるサブクラスメソッドを使用することです。setMean。エンティティの配布オブジェクトは、実行時に決定されます。if(distnType == NORM)dsn = new NormalDistribution; if(distnType == FIXED)dsn = new FixedDistribution;

これはC++で可能ですか、それともポリモーフィズムの概念を完全に失っていますか?dsn変数をスーパークラスとして定義し、実行時に実際の分布に絞り込むのに問題があります。(より簡単な)方法は、ディストリビューションなしでエンティティを定義し、エンティティにアタッチせずにディストリビューションを単独で使用することです。

みんなありがとう

4

2 に答える 2

0

私はあなたがこのようにしたいと思います:

Entity* salesVolume = new Entity;
{
  NormalDistribution *dsn = new NormalDistribution;
  dsn->setMean(3000.0);
  dsn->setStdDev(500.0);
  salesVolume->setDistribution(dsn);
}

Entity* unitCost = new Entity;
{
  FixedDistribution *dsn = new FixedDistribution;
  dsn->setWeights( .. vector of weights);
  dsn->setValues( .. vector of values) ;
  unitCost->setDistribution(dsn);
}

他にも可能性はありますが、これが一番オリジナルのデザインに近いと思います。

于 2012-05-23T03:33:17.340 に答える