Конструктор с необязательными параметрами - PullRequest
0 голосов
/ 15 сентября 2018

Я создал подкласс QLineEdit в Qt, и я хочу дать пользователям возможность установить несколько дополнительных параметров при инициализации / создании элемента управления.Я знаю, что это обрабатывается так, как я определяю конструктор виджета.

Однако я хотел бы сделать эти параметры необязательными, поэтому, если пользователь решит не определять их, конструктор будет использовать значения по умолчанию, которые яустановили.Например, если пользователь не определит 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 голосов
/ 15 сентября 2018

В этом случае просто укажите pathmode по умолчанию

class LineEditPath : public QLineEdit
{
    ...
    explicit LineEditPath(PathMode pathMode = default_or_sentinel_value, QWidget *parent = nullptr);
    ...
}

И удалите другой конструктор. Теперь разница между значением по умолчанию и значением Sentinel здесь будет то, что значение по умолчанию вы будете просто использовать, и не важно, будет ли оно предоставлено пользователем или компилятором по умолчанию. Наверное, это то, что вы хотите здесь.

Значение Sentinel будет специальным значением, например, некоторым нулевым значением, которое нельзя использовать как другие значения. Вам нужно что-то вроде if(pathMode.isNull()) {...handle special case...} else {...use pathMode...}, чтобы справиться с этим правильно.

В более сложном случае вы можете посмотреть делегирование конструкторов (ссылка скопирована из комментария Франсуа Андриё).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...