在C ++程序中,我有一个结构,其中包含指向其自身类型的另一个实例的指针:
struct Foo
{
const Foo* ptr;
};
我想声明并初始化这个结构的两个相互指向的const实例:
const Foo f1 = {&f2};
const Foo f2 = {&f1};
然而,这导致编译时错误error: 'f2' was not declared in this scope
(显然因为f1在f1之后声明,即使f1的声明引用它)。
我正在努力做到可能而且合理吗?如果是,我该如何使其发挥作用?
一种解决方法可能是避免使f1为const,然后在声明f2(f1.ptr = &f2;
)之后重新分配指针,但如果可以的话,我宁愿避免这种情况。
答案 0 :(得分:6)
在命名空间范围内,您可以这样做。
namespace my_constants {
extern Foo const f1;
extern Foo const f2;
Foo const f1 { &f2 };
Foo const f2 { &f1 };
} // namespace my_constants
我可以看到任何非常好的本地范围解决方案,但你原则上可以
auto hack = []( Foo const* pfoo ) -> Foo const&
{
static Foo const other = {pfoo};
return other;
};
static Foo const f1{ &hack( &f1 ) };
Foo const& f2 = hack( 0 );
答案 1 :(得分:3)
您可以将它们放在另一个struct
内。
struct Foo
{
const Foo* ptr;
};
struct interlinked_foos {
Foo a = { & b }; // An initializer may forward-reference a class member.
Foo b = { & a };
} twofoos;
const Foo & f1 = twofoos.a;
const Foo & f2 = twofoos.b;
这是C ++ 11。在C ++ 03中,您似乎需要向Foo
添加构造函数,但原理仍然有效。
它不仅不需要一个对象extern
,这可能会封装模式以供重用。
编辑:这里是一个简单的版本,但稍微不那么优雅的版本(它假定对象的类型相同):
const Foo twofoos[] = { & twofoos[1], & twofoos[0] },
& f1 = twofoos[0], & f2 = twofoos[1];