C ++构造函数init多个成员

时间:2014-05-02 09:40:59

标签: c++ constructor initialization

鉴于此课程:

void calculate( int*, int* );

struct A{
    int p;
    int q;
    A() { calculate( &p, &q ); }
};

我想让成员pq保持不变:

struct A{
    const int p;
    const int q;
    // constructor???
};

问题是,如何初始化这些值?我想在构造函数中调用calculate,或者某种代理函数,但是我怎样才能以一种方式初始化两个值呢?一个明显的想法是构造函数的包装器:

A create_A(){
    int p0;
    int q0;
    calculate( &p0, &q0 );
    return A{ p0, q0 };
}

但这让我没有适当的默认构造函数。非常不方便。有没有办法用默认构造函数来完成这个?

只是为了好玩,我实际上发现了这个,这就是我需要的东西,但实际上并不是一个可行的选择,因为它不是线程安全的:

int foo( bool b )
{
    static int p;
    static int q;
    if( b ){
        calculate( &p, &q );
        return p;
    } else {
        return q;
    }
}

struct A{
    const int p;
    const int q;
    A() : p( foo( true ) ), q( foo( false ) ){}
};

编辑许多人抱怨我使用const成员。但是这个问题在const-members之外是有趣的,在我的特定用例pq中不是int,而是一些没有默认构造函数的类类型,所以我需要使用成员初始化语法,即使它们不是const。哦,当然const-members确实有优势:更快的调试模式,更少的抽象层,更少的复杂性,更多的编译器强制不变量。

1 个答案:

答案 0 :(得分:4)

从辅助函数返回一个结构,并将构造委托给另一个构造函数,如下所示:

#include <utility>
std::pair<int,int> calculate();

struct A{
    const int p;
    const int q;
    A() : A(calculate()) {}
private:
    A(std::pair<int,int> a) : p(a.first), q(a.second) {}
};

委托构造函数是自C ++ 11以来的标准,尽管它们之前在许多编译器中都有用,因为它们是语义上未定义的构造。

但是,这会禁用赋值运算符。您确定内联const - 合格的访问者不是更好的主意吗?它们没有运行时开销。