首页 > 解决方案 > 如何使其他类识别的枚举

问题描述

我在 SimulationEngine 基类中创建了一个名为 RiskFactor 的枚举。

class SimulationEngine
{
public:
    enum RiskFactor { interest_rate, equities, volatility };
    SimulationEngine(double horizon, Wrapper<valuationFunction>& theFunction_, RiskFactor simulatedRiskFactor);
    virtual void DoOnePath(double vol, double normvariate) = 0;
    virtual SimulationEngine* clone() const = 0;
    const virtual double GetHorizon();
    const Wrapper<valuationFunction>& GetFunction() const;
    RiskFactor simulatedRiskFactor;
protected:
    double horizon;
    Wrapper<valuationFunction> theFunction;
};

在派生类中,我有这个方法,在调用对象“TheFunction”的方法时使用 RiskFactor 枚举类型的“simulatedRiskFactor”。

void OneStepBSEngine::DoOnePath(double vol, double normvariate)
{
    double variance = vol * vol * horizon;
    double rootVariance = sqrt(variance);
    double itoCorrection = -0.5 * variance;
    //double movedSpot = spotvalue * exp(drift * horizon + itoCorrection);
    //spotvalue = movedSpot * exp(rootVariance * normvariate);
    double factor = exp(drift * horizon + itoCorrection + rootVariance * normvariate);
    theFunction->RiskFactorMultiply(factor, simulatedRiskFactor);
    return;
}

我应该如何让“theFunction”类寻找它来识别枚举并允许我写最后一行(尚未工作):

theFunction->RiskFactorMultiply(factor, simulatedRiskFactor);

该类目前看起来像这样:

class valuationFunction
{
public:
    valuationFunction(double TTM);
    virtual void ValueInstrument() = 0;
    virtual double GetValue() const;
    virtual void RiskFactorAdd(double increment) = 0;
    virtual void RiskFactorMultiply(double factor) = 0;
    virtual void UpdateTTM(double timeStep);
    virtual valuationFunction* clone() const = 0;
    virtual ~valuationFunction() {}
private:

protected:
    double f;
    double TTM;
};

我希望能够使用枚举 RiskFactor 调用 RiskFactorAdd 和 RiskFactorMultiply 函数。

标签: c++enumsswitch-statement

解决方案


的声明RiskFactorMultiply需要用封闭的类名来限定枚举名。

class valuationFunction
{
// ...
    virtual void RiskFactorMultiply(double factor, SimulationEngine::RiskFactor risk) = 0;
// ...
};

这同样适用于枚举值,例如,如果RiskFactorMultiply想让第二个参数可选。

    virtual void RiskFactorMultiply(double factor, SimulationEngine::RiskFactor risk = SimulationEngine::volatility) = 0;

推荐阅读