2014-01-24 73 views
1

由于某种原因,我需要使用固定大小的字符串。现在我正在查看一个QString类。
但是,我有一些使QString对象具有恒定大小的问题。
例如,我想要大小为10的字符串,这意味着,如果我尝试写入一些字符数超过100个字符的
,它会在100个字符后切出所有字符。
我在Qt的文档中发现的构造函数QString的,但我不知道这是否会工作,我告诉修复QString大小(长度)

  • 的QString(INT大小,QChar则CH)

,你可以在这样的暗示什么情况?

+0

,那么可以继承'QString'和实现自己的构造函数(S)和赋值操作符由超过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"); 
}