我在Qt中创建了QLineEdit
的子类,我想让用户能够在初始化/创建控件时设置一些可选参数。我知道这是通过定义小部件的构造函数的方式来处理的。
但是,我想使这些参数成为可选参数,因此,如果用户决定不定义它们,则构造函数将使用我设置的默认值。例如,如果用户未在下面的代码的构造函数中定义PathMode
,它将默认为LineEditPath::PathMode::ExistingFile
。我不确定该怎么做。
如果正确的方法是拥有多个构造函数,那我很好。在每个构造函数中都有初始化列表似乎只是多余的。
这是我当前的代码:
.h
class LineEditPath : public QLineEdit
{
...
explicit LineEditPath(QWidget *parent = nullptr);
explicit LineEditPath(PathMode pathMode, QWidget *parent = nullptr);
...
}
.cpp
LineEditPath::LineEditPath(QWidget *parent) : QLineEdit(parent),
button(new QPushButton("...", this)),
dialog(new QFileDialog(this)),
defaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)),
m_pathMode(ExistingFile)
{
init();
}
LineEditPath::LineEditPath(LineEditPath::PathMode, QWidget *parent) : QLineEdit(parent),
button(new QPushButton("...", this)),
dialog(new QFileDialog(this)),
defaultDir(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)),
m_pathMode(ExistingFile)
{
init();
// Additional stuff for this constructor...
}
我是否需要多个构造函数,或者我只能有一个构造函数并以某种方式设置默认值?
答案 0 :(得分:1)
在这种情况下,也只需给pathmode设置默认值
class LineEditPath : public QLineEdit
{
...
explicit LineEditPath(PathMode pathMode = default_or_sentinel_value, QWidget *parent = nullptr);
...
}
并删除其他构造函数。现在,这里的默认值和哨兵值之间的区别是,您将只使用该默认值,而不管它是由用户提供还是由编译器提供为默认值。我想这可能就是您想要的。
前哨值将是特殊值,例如某些“空”值,不能像其他值一样使用。您将需要像if(pathMode.isNull()) {...handle special case...} else {...use pathMode...}
这样的东西来正确处理它。
对于更复杂的情况,您可能需要查看delegating constructors(链接来自FrançoisAndrieux的评论)。