Я пишу пользовательский QValidator в проекте QT GUI, и я понимаю, что мне нужно расширить класс QValidator, потому что:Написать на переменный член в сопзИ функции API (C++)
void setValidator(const QValidator *);
должен быть принят подкласс QValidator
. Проблема заключается в том, что функция:
virtual QValidator::State validate(QString& input, int& pos) const Q_DECL_OVERRIDE;
является Const, но мне нужно написать в состояние проверки в моем подклассе, и я не могу написать любой переменный член из-за этого сопзИте атрибут. Как я могу обойти это ограничение API?
Я делаю что-то вроде этого:
QValidator::State IPv4Validator::validate(QString &input, int &pos) const
{
auto validationResult = QRegExpValidator::validate(input, pos);
// custom logic here:
myMemberVariable = something(validationResult);
// more logic
// more logic
// more logic
return validationResult;
}
Спасибо заранее!
Вы используете библиотеку Wrong Way ™, когда у вас есть необходимость позволить базовой проверке изменить состояние вашего объекта. Это не должно. Существует много технических решений (указатель на состояние, 'mutable' state,' const_cast', вызывающий код C), но ** не **. Узнайте, как вы используете Qt неправильно и исправляете свои пути. Работа вокруг 'const'-ness похожа на простое отбрасывание C, когда компилятор жалуется на несовместимые типы, чтобы закрыть его. Это говорит «не рассказывай мне о вероятной проблеме, потому что я действительно знаю, что я делаю», когда реальность противоположна и много печали. –
Вы не должны хранить состояние в QValidator, так как вы можете использовать один и тот же валидатор для нескольких входов .., что было бы невозможно с состоянием! – JvO
Я вижу ваши очки. Делает много смысла – androidu