C++ 构造函数初始化多个成员

标签 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 成员确实有优点:更快的 Debug模式、更少的抽象层、更低的复杂性、更多的编译器强制不变量。

最佳答案

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

#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) {}
};

委托(delegate)构造函数自 C++11 起就已成为标准,尽管它们之前在许多编译器中都有效,因为它们是语义上未定义的构造。

不过,这会禁用赋值运算符。您确定内联 const 限定的访问器不是一个更好的主意吗?它们没有运行时开销。

关于C++ 构造函数初始化多个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23425087/

相关文章:

c++ - 使用 set 检测重复项

c++ - 重写派生类中基类私有(private)成员的行为,C++

ios - 升级到 Swift 3 : cannot override 'init' which has been marked unavailable

c++ - 检测结构是否有填充

c# - protobuf-net 到 .proto 生成枚举冲突?

c++ - 在 map 中存储结构;检查 map 中是否存在结构

java - 如何创建对象的实例而不在构造函数中传递参数?

java - Java 中的空指针异常

c# - 初始化语法 : new ViewDataDictionary { { "Name", "Value"} }

c++ - 将 Mat 从 C++ dll 返回到 VB.Net