【问题标题】:Modifying the member of a class from outside the class in C++在 C++ 中从类外部修改类的成员
【发布时间】:2020-09-04 19:35:49
【问题描述】:

我想知道下面的过程是否真的在做我打算做的事情,并让自己相信不同的做事方式。

我有一个名为 SimulationEngine 的基类,它有一个类型为 ValuationFunction 的对象作为成员,如下所示:

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

然后我有一个名为 MCEngine 的第三个类,它有一个 SimulationEngine 类类型的对象作为成员。其中我的函数如下所示:

void MCEngine::ValuePortfolio()
{
    V = 0;
    for (unsigned long i = 0; i < EngineVector.size(); ++i)
    {
        double placholder = 3;
        EngineVector[i]->GetFunction()->valueInstrument(placholder);
        V += EngineVector[i]->GetFunction()->getValue();
    }
    return;
}

GetFunction() 在获取函数对象时

valueInstrument(placholder)

会修改一个类的成员和

getValue()

将检索刚刚修改的值。现在我的问题本质上是我的 GetFunction() 函数应该是什么样子?我认为根据您的操作方式,您将在适当的位置修改 ValuationFunction 类对象的成员(我们想要做的),或者获取您修改的值的副本,然后在超出范围时丢失(我们不想),对吗?所以我应该这样写:

Wrapper<valuationFunction> SimulationEngine::GetFunction()
{
    return theFunction;
}

或者这是正确的做法:

Wrapper<valuationFunction> SimulationEngine::GetFunction()
{
    return *theFunction;
}

我想说第二种方法是正确的,但在涉及到这些东西时我从来没有真正确定过自己,并且希望能够说服自己相信这里的不同之处。

【问题讨论】:

    标签: c++ class reference


    【解决方案1】:

    我认为您要做的是通过引用返回,如下所示:

    const Wrapper<valuationFunction> & SimulationEngine::GetFunction() const
    {
        return theFunction;
    }
    

    注意使用 const(两次)可以避免成员被无意修改。通过引用返回可以避免复制,但在没有 const 限定符的情况下返回时存在被无意修改的风险。希望这能回答你的问题。

    【讨论】:

    • 谢谢,是的,这可能就是我想要做的。像你说的那样在没有 const 的情况下无意修改它的方法是做类似 EngineVector[i]->GetFunction().member = 5 的事情吗?并且这个操作对于 const 限定符是非法的,对吗?我认为这就是第二个 const 的作用,第一个 const 是做什么的?
    • 是的。甚至重新分配它,例如EngineVector[i]->GetFunction() = newFunc;第一个 const 使 reference 为 const,而第二个 const 使 method 为 const。 This page 看起来不错,尤其是 this section
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2013-10-21
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多