使用指向彼此的指针初始化const结构实例

时间:2014-04-03 02:29:34

标签: c++ pointers struct

在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;)之后重新分配指针,但如果可以的话,我宁愿避免这种情况。

2 个答案:

答案 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];