C++ 两种类型的构造函数重载

C++ 两种类型的构造函数重载,c++,c++11,C++,C++11,我正在制作一个类User。我在下面做了一些构造函数重载: class User { public: explicit User(string firstInit, string secondInit){ this->firstInit = firstInit; this->secondInit = secondInit; }//end constructor explicit User(char firstIn

我正在制作一个类
User
。我在下面做了一些构造函数重载:

class User
{
    public:
    explicit User(string firstInit, string secondInit){
        this->firstInit = firstInit;
        this->secondInit = secondInit;    
    }//end constructor

    explicit User(char firstInit, char secondInit){
        this->firstInit = firstInit;
        this->secondInit = secondInit;    
    }//end constructor

    explicit User(string firstInit, char secondInit){
        this->firstInit = firstInit;
        this->secondInit = secondInit;    
    }//end constructor    

    explicit User(char firstInit, string secondInit){
        this->firstInit = firstInit;
        this->secondInit = secondInit;    
    }//end constructor        
};
我的问题与构造函数重载有关。在这种情况下,我是否需要提供所有4个构造函数示例以满足以下要求:

首字母可以是字符串或字符。没关系。但在所有情况下,用户都可以输入一个或另一个


对于“最佳实践”,我是否满足要求?或者有没有一种方法可以声明一个只包含
字符串和
字符的
枚举
,并且每个变量必须是
枚举
中的一个?

因此您可以使用单个
字符
或整个
标准::字符串
。由于
std::string
也可用于保存单个
char
,因此我建议使用以下方法:

class User
{
private:
    std::string first;
    std::string second;

public:
    explicit User(std::string firstInit, std::string secondInit) :
        first(firstInit),
        second(secondInit)
    {
        //Only this constructor actually initializes any variables.
    }

    explicit User(char firstInit, char secondInit) : User(std::string({ firstInit }), std::string({ secondInit }))
    {
    }

    explicit User(std::string firstInit, char secondInit) : User(firstInit, std::string({ secondInit }))
    {
    }

    explicit User(char firstInit, std::string secondInit) : User(std::string({ firstInit }), secondInit)
    {
    }
};

如果您需要更复杂的初始化逻辑,这也会使用构造函数委托,而您不想重复这些逻辑


作为解释:
std::string({firstInit})
将使用一个字符创建
std::string

对于这种特殊情况来说,这可能是一种过度杀伤力,但您也可以推出一个单独的类,它可以从
char
const char*
(字符串文本)两个字符构造而成可能还有
std::string

class SingleChar 
{
public:
    SingleChar(char c): c{c} {} //constructors are implicit by design
    SingleChar(const char* c): c{c[0]} {}
    char asChar() {return c;}
    std::string asString() {return std::string(1, c);}
private:
    char c;
};
有了这样一个类,构造函数可以接受
'a'
“a”
作为有效条目:

class User
{
    User(SingleChar firstInit, SingleChar secondInit):
        firstInit{firstInit.asChar()}, //or asString if you'd rather have std::string
        secondInit{secondInit.asChar()}
    {}
private:
    char firstInit;
    char secondInit;
};

User x {'a', "a"}; //works

但正如我所说,这可能是一种过度的杀伤力。另外,哪个版本更容易阅读可能有争议-
char
std::string
是显而易见的,每个人都知道它们,但是
SingleChar
是一个新事物,读者必须首先了解这个类的功能。

最佳实践总是在构造函数的初始化列表中初始化类成员,而不是在构造函数主体中。构造函数中的“this->somethingorother
”永远不是“最佳实践”。至于问题的其余部分,它太模糊、太宽泛,无法给出明确的答案。“用户可以输入一个或另一个。”这不需要两个构造函数吗?一个代表字符串,一个代表字符?也许这只是我的解释。除非您愿意创建一个单独的类似字符串的类,该类可以从
char
const char[2]
转换,否则它将尽可能好。您好@SamVarshavchik,很抱歉响应延迟。你能举个例子来说明你的意思吗?我有点自学C++,所以在课本之外,我没有很多经验。有两个变量必须传递给构造函数,这两个变量可以是字符串或字符。对不起,措辞不好。