对于类层次结构,例如:
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
. 完成后,我希望对 to 所做的更改d.i
“坚持” b.i
。成员变量的明显解决方案base& b
不起作用,因为访问i
需要不同的语法:b.i
而不是i
.
将实例复制derived
回base
我完成时会起作用;但这似乎很臭。
{
derived d;
d.f(); // d.i == 2
b = d; // copy, YUCK!
}
但我真的只想要并且需要一个base
.
实际发生的是我正在尝试模拟嵌套函数;但我不想更改语法以访问i
或j
。
在伪代码中,我想做类似的事情:
struct s final
{
int i = 1;
void f()
{
int j = 2;
auto g = [&]();
}
// ... other code ...
void f::g() { i = 10; j = 20; }
};
换句话说,“本地函数”的实际代码远离它的声明位置。