你可以有一个包装类,有一个字符串,但不是字符串,但它可以用于任何一个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");
}
,那么可以继承'QString'和实现自己的构造函数(S)和赋值操作符由超过100个字符的一切切割限制字符串中的字符数。 – vahancho
子类化QString可能不是一个好主意。与尺寸相关的几种方法都不是虚拟的。您还必须触摸修改字符串大小的所有函数。这几乎是所有的功能... – UmNyobe
@vahancho QString的子类化是一个非常糟糕的主意,因为QString是线程安全的类,它实现了COW和许多其他的东西。可能有很多错误。 –