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 §ion, const string &subsection) {
*this = UserInput(title, section, subsection);
}
这样效率会高一点。您还应该对实际构造函数的参数进行相同的更改。
编辑:这里是评论中引用的另一种方法。这个有点多"standard-ish"。构造函数调用额外的 class 方法来完成对象的构造是很常见的。这仅在 class 成员具有默认构造函数时有效。如前所述,这里有一些重复的工作——class 成员首先默认构造,然后再完全构造。但是,它确实倾向于消除代码重复,并且在性能或效率不是最重要的情况下更简洁一些。
UserInput::UserInput(const string &title, const string §ion, const string &subsection)
{
operator()(title, section, subsection);
}
void UserInput::operator()(const string &title, const string §ion, const string &subsection) {
this->title = title;
this->section = section;
this->subsection = subsection;
SPLIT();
}
是否可以成为 "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 §ion, const string &subsection) {
*this = UserInput(title, section, subsection);
}
这样效率会高一点。您还应该对实际构造函数的参数进行相同的更改。
编辑:这里是评论中引用的另一种方法。这个有点多"standard-ish"。构造函数调用额外的 class 方法来完成对象的构造是很常见的。这仅在 class 成员具有默认构造函数时有效。如前所述,这里有一些重复的工作——class 成员首先默认构造,然后再完全构造。但是,它确实倾向于消除代码重复,并且在性能或效率不是最重要的情况下更简洁一些。
UserInput::UserInput(const string &title, const string §ion, const string &subsection)
{
operator()(title, section, subsection);
}
void UserInput::operator()(const string &title, const string §ion, const string &subsection) {
this->title = title;
this->section = section;
this->subsection = subsection;
SPLIT();
}