Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;蒙特卡洛模拟的类设计_C++_Class_Montecarlo - Fatal编程技术网

C++ C++;蒙特卡洛模拟的类设计

C++ C++;蒙特卡洛模拟的类设计,c++,class,montecarlo,C++,Class,Montecarlo,我正在尝试构建一个Monte Carlo对象类,我想知道设计相关类的最佳方法 对象(称为实体)的结构包含名称、描述和分布类型,分布类型可以是几种不同的类型,如正态、固定整数、三角形等。 分布类是(或可能是)特定分布的超类,如正态分布 所以,我有 class Entity { public: string name; Distribution* dsn; // superclass. Can this be done? } class Distribution { public:

我正在尝试构建一个Monte Carlo对象类,我想知道设计相关类的最佳方法

对象(称为实体)的结构包含名称、描述和分布类型,分布类型可以是几种不同的类型,如正态、固定整数、三角形等。 分布类是(或可能是)特定分布的超类,如正态分布

所以,我有

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);
}
FixedDistribution也将是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) ;
然后

我想做的是在实体中定义一个分布(超类),然后使用它的子类方法,这取决于分布类型,例如setMean。实体中的分布对象将在运行时确定,例如。 如果(distnType==NORM)dsn=新正态分布; 如果(distnType==固定)dsn=新的固定分布

这是C++中的可能,还是完全失去了多态性的概念?我很难将dsn变量定义为超类,然后在运行时缩小到实际分布。一种(更简单的)方法是定义实体而不使用分发,并单独使用分发,而不附加到实体


谢谢大家

我想你们应该这样做:

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);
}

还有其他可能性,但我认为这最能代表您的原始设计。

根据pg1989和Robert Cooper的答案发布了自己的解决方案

要定义不同类型的分发,将使用模板。
访问者模式可以用来解决需要一个主类的不同实现的问题。

难道不能用模板来解决这个问题吗?编写一个以发行版类型为模板的类?您在倒数第二段中描述的内容被称为“运行时类型信息”,这是一种非常糟糕的样式,几乎没有必要。如果您需要
实体
具有相同的类型,无论其分布如何,我会使用。感谢pg1989和Robert Cooper。这正是我想要的信息。我将去掉运行时类型信息,研究访问者模式并对其进行模板化。皮特,这就是我想做的。问题在于实体的定义,其中setDistribution的结果可以是正态分布或固定分布。由于实体是指向两种不同类型对象的指针,实体将如何处理这一点?@Pete855217:因为它们都是从分布中派生的,setDistribution方法只需要获取一个分布指针。谢谢Vaughn,这就是我在原始代码中尝试做的,有一些问题,但我认为它们只是一些小的编码问题。
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);
}