初始化列表中的中间计算

时间:2016-06-01 22:37:15

标签: c++

我有类似

的东西
struct Foo {
    const double a;
    const double b;
    Foo(double c);
}

Foo::Foo(double c) {
    double tmp = f(c);
    a = g(tmp);
    b = h(tmp);
}

其中f,g,h是在别处实现的功能。这给出了预期的"未初始化的const成员"错误。

我可以用

修复它
Foo::Foo(double c): a (g(f(c))), b (h(f(c))) {}

但是f是一项昂贵的功能,我不想再运行两次。

我的问题是,如何在不运行f两次或让tmp成为Foo的常任成员的情况下解决此问题?

1 个答案:

答案 0 :(得分:7)

通常,委托构造函数为这类问题提供了一种简单的解决方案。在这种情况下,您必须介绍一些区分两个构造函数的方法:

private:
  // the int param is unused
  Foo(double fc, int) : a(g(fc)), b(h(fc)) {}

public:
  Foo(double c) : Foo(f(c), 0) {}