我正在尝试构建一个蒙特卡罗对象类,并且想知道设计相关类的最佳方法。
对象的结构(称为Entity)包含名称,描述和分布类型,可以是几种不同的类型,例如。正常,固定整数,三角形等 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变量定义为超类,然后在运行时缩小到实际分布。一种(更简单的)方法是定义没有分布的实体,并且自己使用分布,而不附加到实体。
谢谢你们
答案 0 :(得分: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);
}
还有其他可能性,但我认为这最能代表您的原创设计。
答案 1 :(得分:0)
根据pg1989和Robert Cooper的答案发布自己的解决方案。
要定义不同类型的分布,将使用模板。 访问者模式可用于解决需要不同的主类实现的问题。