gpt4 book ai didi

c++ - 处理用于构造有用值的旧变量

转载 作者:行者123 更新时间:2023-11-28 06:35:42 24 4
gpt4 key购买 nike

假设有以下两个类:

struct A {
A() {}
};

struct B {
B(const A& a) {}
};

我多次遇到这样的情况,我必须创建一个类的临时实例才能构建我需要使用的实例。像这样的东西:

A a;
// Do very complex computations using a;
B b(a);
// use b, a is not needed anymore.
return make_result(b);

我的问题是,有时在我的计算之后 a 持有的资源可能很重要,在我实例化 b 之后我想释放它们。同时,整个过程 a -> b -> result 在逻辑上是一个非常紧凑的东西,我想避免将它拆分成函数,因为在这种情况下会有 pretty much nothing to gain .

C++ 中有哪些可用的解决方案来解决此类问题?

最佳答案

您可以将默认构造的对象分配给 A,假设 A 的赋值运算符正确地释放了“资源”:

A a;
// Do very complex computations using a;
B b(a);
a = {};
// use b, a is not needed anymore.
return make_result(b);

您可以更改 B 以按值获取 A 并将构造的 A 实例移动到 B 中:

struct A {
A() {}
};

struct B {
B(A a) {}
};
// ...
A a;
// Do very complex computations using a;
B b(std::move(a));
// use b, a is not needed anymore.
return make_result(b);

它有一个很好的优势,即 B 的构造函数可能会从 A 对象中“窃取”资源。

您可以使用 lambda 构造 A 并将其传递给 B:

B b([&]{
A a;
// Do very complex computations using a;
return a;
}());
// use b, a is not needed anymore.
return make_result(b);

你可以用 lambda 构造 A B 按值获取它:

struct A {
A() {}
};

struct B {
B(A a) {}
};
// ...
B b([&]{
A a;
// Do very complex computations using a;
return a;
}());
// use b, a is not needed anymore.
return make_result(b);

它允许 BA 窃取东西,但不会留下僵尸 A 实例。

关于c++ - 处理用于构造有用值的旧变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818467/

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