21

在 C++ 中,有没有办法在初始化列表中拥有类似临时变量的东西。我想用相同的实例初始化两个常量成员,而不必将其传入,删除 const 要求,使用工厂(即传入但让工厂生成它以对 API 用户隐藏它),或者让 temp 实际上是一个成员变量。

即类似的东西

Class Baz{
    const Foo f;
    const Bar b;
    Baz(Paramaters p):temp(p),f(p,temp),b(p,temp){ //temp is an instance of Something
                                                  // But NOT A member of Baz
    // Whatever
    }
}

代替

Class Baz{
    Foo f;
    Bar b;
    Baz(Paramaters p){
        Something temp(p);
        f = Foo(p,temp)
        b = Bar(p,temp)
    }
}

或者

Class Baz{
    Foo f;
    Bar b;
    Baz(Paramaters p,Something s):f(p,s),b(p,s){
    }
}
4

2 回答 2

33

在 C++11 中,您可以使用委托构造函数:

class Baz{
    const Foo f;
    const Bar b;
    Baz(Paramaters p) : Baz(p, temp(p)) { } // Delegates to a private constructor
                                            // that also accepts a Something
private:
    Baz(Paramaters p, Something const& temp): f(p,temp), b(p,temp) {
        // Whatever
    }
};
于 2013-06-28T23:38:11.057 回答
1

有几种模式可以实现这一点。

在 C++11 中使用委托构造函数:

class Baz {
public:
    Baz(Paramaters p) :
        Baz{p, Something{p}}
    {}
private:
    Baz(Paramaters p, Something temp) :
        f{p, temp},
        b{p,temp}
    {}

    const Foo f;
    const Bar b;
};

使用基类:

class BazBase {
public:
    BazBase(Paramaters p, Something temp) :
        f{p, temp},
        b{p,temp}
    {}
protected:
    const Foo f;
    const Bar b;
};

class Baz : private BazBase {
public:
    Baz(Paramaters p) :
        BazBase{p, Something{p}}
    {}
};

使用工厂方法:

class Baz {
public:
    static Baz make(Parameters p)
    {
        return {p, Something{p}};
    }
private:
    Baz(Paramaters p, Something temp) :
        f{p, temp},
        b{p,temp}
    {}

    const Foo f;
    const Bar b;
};
于 2020-06-28T10:22:36.897 回答