【问题标题】:Fix QString size (length)修复 QString 大小(长度)
【发布时间】:2014-01-24 14:14:40
【问题描述】:

出于某种原因,我需要使用固定大小的字符串。现在我正在寻找一个 QString 类。
但是我有一些关于使 QString 对象具有恒定大小的问题。
例如,我想要一个大小为 10 的字符串,这意味着,如果我尝试编写一些包含超过 100 个字符的
字符串,它将删除 100 个字符之后的所有字符。
我在 Qt 文档中找到了 QString 的构造函数,但我不确定它是否会像我说的那样工作

  • QString(int size , QChar ch)

在这种情况下你有什么建议?

【问题讨论】:

  • 您可以继承QString 并实现自己的构造函数和赋值运算符,通过剪切超过 100 个字符的所有内容来限制字符串中的字符数。
  • 子类化 QString 可能不是一个好主意。与大小有关的几种方法都不是虚拟的。您还必须触摸所有修改字符串大小的函数。这几乎是所有功能......
  • @vahancho QString 的子类化是一个非常糟糕的主意,因为 QString 是线程安全的类,它实现了 COW 和许多其他东西。可能有很多错误。
  • @tema - 您应该在将字符串放入 QString 之前简单地预处理您的字符串。这是一个很好的模式。
  • 顺便说一句,如果你能比For some reason 更明确一点,我们或许可以提供一些替代方案?

标签: c++ string qt qstring


【解决方案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");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多