委托的构造函数

pre*_*eys 3 c++ constructor

考虑以下代码:

#include <iostream>

struct A {
    A(int n, char c, bool b) 
        /* : some complex initialization list that you don't want to repeat. */
        {initialize();}
    A(int n) : A(n, default_char, default_bool) {}
    A(char c) : A(default_int, c, default_bool) {}  // Do not want initialize() called!
    A(bool b) : A(default_int, default_char, b) {}
    A(int n, char c) : A(n, c, default_bool) {}
    A(int n, bool b) : A(n, default_char, b) {}  // Do not want initialize() called!
    A(char c, bool b) : A(default_int, c, b) {}
private:
    static const int default_int = 3;
    static const char default_char = 't';
    static const bool default_bool = true;
    void initialize() {std::cout << "A ctor.\n";}
};

int main() {
    A a(5,'a',false);
    A b(5);
    A c('a');
    A (5,'a');
    A (5,false);
    A ('a',false);
}
Run Code Online (Sandbox Code Playgroud)

假设我不想initialize();为某些构造函数调用(例如在代码中声明).如何在不重复A(int,char,bool)构造函数的"复杂初始化列表"的情况下避免这种情况(以避免将来的维护问题)?

Tob*_*ght 6

您可以为您的类提供一个私有构造函数,所有公共构造函数都委托给它.这里,第一个参数决定是否初始化:

private:
    A(bool do_initialize, int n, char c, bool b)
        /* initialisers */
    { if (do_initialize) initialize(); }

public:
    A(int n, char c, bool b) : A(true, n, c, b) {}
    A(int n) : A(true, n, default_char, default_bool) {}
    A(char c) : A(false, default_int, c, default_bool) {}  // Do not want initialize() called!
    A(bool b) : A(true, default_int, default_char, b) {}
    A(int n, char c) : A(true, n, c, default_bool) {}
    A(int n, bool b) : A(false, n, default_char, b) {}  // Do not want initialize() called!
    A(char c, bool b) : A(true, default_int, c, b) {}
Run Code Online (Sandbox Code Playgroud)