gpt4 book ai didi

c++ - 使用移动语义将基类实例插入子类实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:06 25 4
gpt4 key购买 nike

假设我有一个实例化的Base bFooBase 的子类。

我想要做的是拥有一个Foo

的构造函数
class Foo : public Base
{
Foo(Base b, T otherArg) : Base(b)
{
/*ToDo - do something with otherArg*/
}
}

将“b”实例移动到正在构建的 Foo 实例。如果 Foo 的构造失败(例如,在我的 /*ToDo 步骤*/ 中),则不应移动 b

我可以在 C++11 中执行此操作吗? (我买不起深拷贝)。构造函数原型(prototype)是否需要为 Foo(Base&& b, T otherArg)

最佳答案

是的,你可以:

  • Base 类声明一个移动构造函数,以便接受右值
  • std::move 移动基本参数

示例:

#include <iostream>
#include <utility>

class Base
{
public:

Base() {}

Base(Base&& b) { std::cout << "Move ctr"; }
};

class Foo : public Base
{
public:

Foo(Base&& b, double otherArg) : Base(std::move(b))
{
// ...
}
};

int main()
{
Foo(Base(), 2.0);
}

或者

int main()
{
Base b;
Foo(std::move(b), 2.0);
}

注意:

  • 至于异常情况下的回滚,你仍然可以在 Base(Base&& b) 中保存 b 的状态(当然是在对它做任何事情之前) ), 并在 Foo 构造函数中发生异常时通过 rollback_move 成员函数恢复它。

Live demo

关于c++ - 使用移动语义将基类实例插入子类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25378226/

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