【发布时间】:2021-11-16 00:56:21
【问题描述】:
对于像这样的类层次结构:
struct base { int i = 1; };
struct derived final : public base
{
int j = 2;
void f() { i = 2; }
};
// more derivations from base
我想要一种方法来创建derived 的实例,但使用现有的base 实例。例如:
base b; // b.i == 1
{
derived d;
d.f(); // d.i == 2
}
有没有办法让调用d.f() 后b.i 的值为2?正如我试图指出的,derived 的生命周期相当短。
从概念上讲,我想让base 看起来像derived 一会儿,“看起来像”意味着访问d.j。完成后,我希望对 d.i 所做的更改“坚持”b.i。 base& b 成员变量的明显解决方案不起作用,因为访问 i 需要不同的语法:b.i 而不是 i。
完成后将derived 实例复制回base 会起作用;但这似乎很臭。
{
derived d;
d.f(); // d.i == 2
b = d; // copy, YUCK!
}
但我真的只想要并且需要base 的一个实例。
实际发生的事情是我正在尝试simulate nested functions;但我不想更改语法以访问i 或j。
在伪代码中,我想做这样的事情:
struct s final
{
int i = 1;
void f()
{
int j = 2;
auto g = [&]();
}
// ... other code ...
void f::g() { i = 10; j = 20; }
};
换句话说,“本地函数”的实际代码远离它的声明位置。
【问题讨论】:
-
“实际情况是我正在尝试模拟嵌套函数;”。 lambda 可能对此有所帮助。
-
我的意思是您链接中的解决方案(和问题)来自 2002 年。目前,还有其他解决方案。
-
不清楚您可以在代码中更改什么?正在做
b = d;(带切片)解决您的问题吗? ((初始状态和)在d中所做的更改将被复制到b)。 -
你如何使用
s? -
你的真实
base有多复杂?您能否在d中引用共享基础对象中的成员(例如int &i = b.i;)而不从base本身派生?
标签: c++ inheritance allocation local-functions