2017-02-15 3 views
2

Я пишу пользовательский 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; 
} 

Спасибо заранее!

+8

Вы используете библиотеку Wrong Way ™, когда у вас есть необходимость позволить базовой проверке изменить состояние вашего объекта. Это не должно. Существует много технических решений (указатель на состояние, 'mutable' state,' const_cast', вызывающий код C), но ** не **. Узнайте, как вы используете Qt неправильно и исправляете свои пути. Работа вокруг 'const'-ness похожа на простое отбрасывание C, когда компилятор жалуется на несовместимые типы, чтобы закрыть его. Это говорит «не рассказывай мне о вероятной проблеме, потому что я действительно знаю, что я делаю», когда реальность противоположна и много печали. –

+2

Вы не должны хранить состояние в QValidator, так как вы можете использовать один и тот же валидатор для нескольких входов .., что было бы невозможно с состоянием! – JvO

+0

Я вижу ваши очки. Делает много смысла – androidu

ответ

0

После прочтения ваших комментариев, я понял, что нужно делегировать свою собственную логику вне QValidator подкласса. Спасибо за ваши ответы! Они помогли мне понять, что я делаю неправильно.

3

Вы можете написать переменную-член в функции const, объявив переменную-член mutable или используя const_cast (небезопасно).

struct A { 
    void foo() const { 
     a = 3; 
     const_cast<A*>(this)->b = 4; 
    } 

    mutable int a; 
    int b; 
}; 
+2

Здесь * «небезопасно» * означает «вызывает неопределенное поведение, если экземпляр const». – user2079303

+6

Я бы не рекомендовал техническое обходное решение, чтобы сломать наложенную 'const' -ness библиотеки Qt. –

+1

Если вы перейдете по пути 'mutable' (это нормально), убедитесь, что ваши записи являются потокобезопасными (например, используйте атомную запись в' a' в приведенном выше примере)., .... или читайте 'Пункт 16: Сделать константные функции-члены потокобезопасными' из эффективных современных C++ – marcinj