2014-01-24 1 views
1

По какой-то причине мне нужно использовать строку с фиксированным размером. Теперь я ищу класс QString.
Но есть вопросы, связанные с тем, что объект QString имеет постоянный размер.
Например, я хочу иметь строку с размером 10, это означает, что если бы я попытался написать строку длиной
с более чем 100 символами в ней, она вырезала бы все символы после 100.
я нашел конструктор QString в Qt документации, но я не уверен, если это будет работать, как я сказалFix QString size (длина)

  • QString (размер INT, QChar ч)

Что вы можете предложить в таких ситуация?

+0

Вы можете подклассифицировать QString и реализовать свой собственный конструктор (ы) и оператор присваивания, чтобы ограничить число символов в строке, разрезав все, что превышает 100 символов. – vahancho

+2

Подкласс QString, вероятно, не очень хорошая идея. Несколько методов, связанных с размером, не являются виртуальными. вам также придется коснуться всех функций, изменяющих размер строки. Это почти все функции ... – UmNyobe

+1

@vahancho подклассификация QString - очень плохая идея, потому что QString - это поточно-безопасный класс, который реализует COW и множество других вещей. Там может быть много ошибок. –

ответ

1

Вы можете иметь класс-оболочку, которая имеет строку, но не строка, но он может быть использован везде, где QString можно было бы использовать. Он также может использоваться со всеми методами и операторами QString, если вы рассматриваете его так, как будто это указатель.

#include <QString> 

class FixedWidthString { 
    mutable QString m_string; 
    //! Ignored if negative. 
    int m_maxLength; 
    inline const QString& data() const { 
     if (m_maxLength >= 0 && m_string.length() > m_maxLength) 
      m_string.truncate(m_maxLength); 
     return m_string; 
    } 
    inline QString& data() { 
     if (m_maxLength >= 0 && m_string.length() > m_maxLength) 
      m_string.truncate(m_maxLength); 
     return m_string; 
    } 
public: 
    explicit FixedWidthString(int maxLength = -1) : m_maxLength(maxLength) {} 
    explicit FixedWidthString(const QString & str, int maxLength = -1) : m_string(str), m_maxLength(maxLength) {} 
    operator const QString&() const { return data(); } 
    operator QString&() { return data(); } 
    QString* operator->() { return &data(); } 
    const QString* operator->() const { return &data(); } 
    QString& operator*() { return data(); } 
    const QString& operator*() const { return data(); } 
    FixedWidthString & operator=(const FixedWidthString& other) { 
     m_string = *other; 
     return *this; 
    } 
}; 

int main() { 
    FixedWidthString fs(3); 
    FixedWidthString fs2(2); 
    *fs = "FooBarBaz"; 
    Q_ASSERT(*fs == "Foo"); 
    fs->truncate(2); 
    Q_ASSERT(*fs == "Fo"); 
    fs->append("Roo"); 
    Q_ASSERT(*fs == "FoR"); 
    fs->truncate(1); 
    *fs += "abc"; 
    Q_ASSERT(*fs == "Fab"); 
    fs2 = fs; 
    Q_ASSERT(*fs2 == "Fa"); 
} 
Смежные вопросы