BDi*_*Dig 6 c++ design-patterns copy-constructor c++11
我正在阅读Mark Joshi的C++ Design Patterns and Derivatives Pricing,并在C++ 11中实现他的代码.在我讨论虚拟拷贝构造函数的第4章之前,一切都进行得很顺利.
PayOffDoubleDigital thePayOff(Low, Up);
VanillaOption theOption(thePayOff, Expiry);
Run Code Online (Sandbox Code Playgroud)
这里的问题是VanillaOption包含对的引用thePayOff.如果是这种情况并且有人修改了thePayOff,则theOption可以在不知情的情况下修改行为.他建议的解决方案是在PayOffDoubleDigital基类中创建一个虚拟拷贝构造函数,PayOff以便theOption包含它自己的副本:
virtual PayOff* clone() const = 0;
Run Code Online (Sandbox Code Playgroud)
然后在每个继承的类中定义:
PayOff* PayOffCall::clone() const
{
return new PayOffCall(*this);
}
Run Code Online (Sandbox Code Playgroud)
回归新事物让我觉得C++ 11可能不合适.那么使用C++ 11处理这个问题的正确方法是什么?
And*_*owl 12
他建议的解决方案是在PayOffDoubleDigital的基类中创建一个虚拟拷贝构造函数[...]
首先,clone()不是复制构造函数.类的复制构造X函数是一个特殊的成员函数,没有返回类型,通常具有签名:
X(X const&)
Run Code Online (Sandbox Code Playgroud)
并可能有签名:
X(X&)
Run Code Online (Sandbox Code Playgroud)
函数clone()只是一个常规(虚拟)函数,它的特殊含义被你 - 用户 - 识别为创建对象克隆的东西,而不是编译器,它不知道是什么clone().
回归新事物让我觉得C++ 11可能不合适
这是真的,使用new在C++ 11中不是惯用的.实际上,在C++ 11中你应该(几乎)永远不会使用,new除非你正在进行真正的低级内存管理(除非你真的需要,你应该避免这种情况) - 而在C++ 14中,你可以删除"几乎" ".不幸的是,这可能new是需要的特殊情况.
我这样说是因为我相信返回一个unique_ptr听起来像是在这里做的恰当的事情(选项对象必须保持自己的PayOff对象,并且只要选项对象存活就必须保持活动状态),并且没有std::make_unique()功能在C++ 11中(它将在C++ 14中出现):
std::unique_ptr<PayOff> PayOffCall::clone() const
{
return std::unique_ptr<PayOff>(new PayOffCall(*this));
}
Run Code Online (Sandbox Code Playgroud)
拥有VanillaOption(或其基类)unique_ptr而不是原始指针会使得返回delete的PayOff对象变得不必要clone().反过来,不必delete该对象表示没有需要定义一个用户提供的析构函数,并没有必要采取的关怀的三个规则,五规则,或诸如此类的东西.
无论何时,只要遵循R. Martinho的费尔南德斯的建议,就可以选择Zero of Zero.