带有可选参数的构造函数

时间:2018-09-15 13:43:36

标签: c++ qt

我在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...
}

我是否需要多个构造函数,或者我只能有一个构造函数并以某种方式设置默认值?

1 个答案:

答案 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的评论)。