gpt4 book ai didi

C++11 虚拟拷贝构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:29 25 4
gpt4 key购买 nike

我正在阅读 Mark Joshi 的 C++ 设计模式和衍生产品定价,并在 C++11 中实现他的代码。一切都进行得很顺利,直到我看到他讨论虚拟拷贝构造函数的第 4 章。

PayOffDoubleDigital thePayOff(Low, Up);
VanillaOption theOption(thePayOff, Expiry);

这里的问题是 VanillaOption 包含对 thePayOff 的引用。如果是这种情况并且有人修改了 thePayOff,则 theOption 的行为可能会被无意中修改。他建议的解决方案是在 PayOffDoubleDigital 的基类 PayOff 中创建一个虚拟拷贝构造函数,以便 theOption 包含自己的拷贝:

virtual PayOff* clone() const = 0;

然后在每个继承类中定义:

PayOff* PayOffCall::clone() const
{
return new PayOffCall(*this);
}

返回 new 让我觉得在 C++11 中可能不合适。那么使用 C++11 处理这个问题的正确方法是什么?

最佳答案

The solution he advises is to create a virtual copy constructor in PayOffDoubleDigital's base class [...]

首先,clone() 不是复制构造函数。 X 类的复制构造函数是一个没有返回类型的特殊成员函数,通常具有以下签名:

X(X const&)

并且可能有签名:

X(X&)

Function clone() 只是一个常规(虚拟)函数,它的特殊含义被您(用户)识别为创建对象克隆的东西,但编译器不识别,它不知道 clone() 做了什么。

Returning new caught me as something that might be inappropriate in C++11

没错,使用 new 在 C++11 中并不是惯用的。事实上,在 C++11 中,你应该(几乎)永远不要使用 new 除非你正在做真正低级的内存管理(你应该避免的事情,除非你真的必须) - 在 C++14 中,您可以删除“几乎”。不幸的是,这可能是需要 new 的异常(exception)情况。

我这么说是因为我相信返回一个 unique_ptr 听起来像是在这里做的合适的事情(选项对象必须持有它自己的 PayOff 对象,而且只要选项对象还活着,就必须保持活着),并且 C++11 中没有 std::make_unique() 函数(它将在 C++14 中存在):

std::unique_ptr<PayOff> PayOffCall::clone() const
{
return std::unique_ptr<PayOff>(new PayOffCall(*this));
}

VanillaOption(或其基类)持有一个 unique_ptr 而不是一个原始指针,这样就没有必要删除 clone() 返回的 PayOff 对象。反过来,不必 delete 该对象意味着不需要定义用户提供的析构函数,也不需要关心 Rule of Three。 , Rule of Five ,或诸如此类。

只要有可能,请关注 R. Martinho's Fernandes's advice去寻找Rule of Zero .

关于C++11 虚拟拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16793835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com