C++重载括号运算符在初始化后构造class/object?

C++ overload parenthesis operator to construct class/object after initialization?

是否可以成为 "DRY"(不要重复自己)?我想声明我的 class 并在以后构建它。

此代码有效:

// default constructor        
UserInput::UserInput() {}; 

// other constructor
UserInput::UserInput(string title, string section, string subsection) :
    title(title), section(section), subsection(subsection) {
    SPLIT();
}

// i want to be "DRY", is it possible?
// this is the same code as the "other constrcutor"
void UserInput::operator()(string title, string section, string subsection) {
    this->title = title;
    this->section = section;
    this->subsection = subsection;
    SPLIT();
}

这不起作用,class 以空白字符串结束:

void UserInput::operator()(string title, string section, string subsection) {
    UserInput(title, section, subsection);
}
void UserInput::operator()(string title, string section, string subsection) {
    *this = UserInput(title, section, subsection);
}

这不是很有效,但如果性能对您来说不是问题,这就可以了。

void UserInput::operator()(const string &title, const string &section, const string &subsection) {
    *this = UserInput(title, section, subsection);
}

这样效率会高一点。您还应该对实际构造函数的参数进行相同的更改。

编辑:这里是评论中引用的另一种方法。这个有点多"standard-ish"。构造函数调用额外的 class 方法来完成对象的构造是很常见的。这仅在 class 成员具有默认构造函数时有效。如前所述,这里有一些重复的工作——class 成员首先默认构造,然后再完全构造。但是,它确实倾向于消除代码重复,并且在性能或效率不是最重要的情况下更简洁一些。

UserInput::UserInput(const string &title, const string &section, const string &subsection)
{
    operator()(title, section, subsection);
}

void UserInput::operator()(const string &title, const string &section, const string &subsection) {
    this->title = title;
    this->section = section;
    this->subsection = subsection;
    SPLIT();
}