2017-02-15 40 views
2

我寫在一個QT GUI項目自定義QValidator,和我的理解一個成員變量是,我需要延長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

當您需要讓基本驗證改變對象的狀態時,您正在使用錯誤路徑™庫。它不應該。有許多技術變通方法(指向狀態的指針,'mutable'狀態,'const_cast',調用C代碼)但**不**。瞭解你如何使用Qt錯誤並修補你的方式。解決'const''問題就像在編譯器抱怨不兼容的類型時關閉C語言一樣。這表達了「不要告訴我一個可能的問題,因爲我真的知道我在做什麼」,當現實是相反的時候,會有很多悲傷的結果。 –

+2

你不應該在QValidator中存儲狀態,因爲你可以對多個輸入使用同一個驗證器..。這對狀態是不可能的! – JvO

+0

我明白你的觀點。很有意義 – androidu

回答

0

在閱讀您的意見後,我意識到我需要將我的自定義邏輯委託給QValidator子類之外。謝謝您的反饋!他們幫助我瞭解我做錯了什麼。

3

通過聲明成員變量mutable或使用const_cast(不安全),可以在const函數中編寫成員變量。

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

    mutable int a; 
    int b; 
}; 
+2

這裏*「不安全」*表示「如果實例爲const,則會導致未定義的行爲」。 – user2079303

+6

我不會推薦一種技術解決方法來打破Qt庫強加的'const'性。 –

+1

如果你想用'mutable'路徑(這是可以的),確保你的寫操作是線程安全的(例如在上面的例子中使用原子寫入'a'),....或者讀取'Item 16:使有效的現代C++的const成員函數線程安全 – marcinj