【问题标题】:QVector<T> operator= and operator[]QVector<T> operator= 和 operator[]
【发布时间】:2013-07-11 11:49:37
【问题描述】:

我在暑假期间为我的朋友编写一个程序,但我遇到了非常奇怪的问题。

我在自制模板类中使用 operator= 将 QVector 分配给其他 QVector,然后尝试检查这第二个 QVector 是否有任何元素。首先,我正在检查它的大小,它很好,但是当我使用 operator[] 和作为 T 类成员的函数 GetName() 时。

这里有一些代码:

 template <template T> class Turniej {
 private:
  QVector<T>* list_;
  QVector<Stol<T> > stoly_;
  int round_;
  int max_rounds_;
  Turniej() {round_=1;}
 public:
  static Turniej& GetTurniej() {
   static Turniej turniej;
   return turniej; }
  void SetList(QVector<T> *list) {list_=list; }
  QVector<T>& GetList() {return *list_;}
  //Some other irrelevant methods
 };

然后我参考 QVector 调用 SetList() 函数,该 QVector 填充了 Gracz 类的 2 个对象

  Turniej<Gracz>::GetTurniej().SetList(&list)

当我最终尝试通过下面的代码访问 Turniej 类中的 list_ 对象时,我收到了这个错误: QVector::operator[] 中的 ASSERT 失败:“索引超出范围”,文件 .../QtCore/qvector.h,第 356 行

 qDebug()<<Turniej<Gracz>::GetTurniej().GetList()[0].GetName();

GetName() 返回一些 QString 并且肯定该方法存在于 Gracz 类中。

我非常感谢任何帮助,因为我坚持了 2 天,完全不知道发生了什么。奇怪的是,我试图用谷歌搜索该错误,但在 qvector.h 的特定行中没有找到任何有错误的主题。 我正在使用带有 Qt Creator 的 Qt 5.0.2

感谢您的帮助!

【问题讨论】:

  • 你为什么要通过指针来处理QVector?我的猜测是,当您访问它时,指针是无效的。只需使用普通的 QVector。
  • 返回对取消引用指针的引用是个坏主意,您可以取消引用 NULL 或未初始化的指针!!!
  • 我确实更改了指向普通 QVectors 的指针并尝试在 list_=list 的 SetList() 函数中使用 operator= 并且仍然相同

标签: c++ qt


【解决方案1】:

当您调用 SetList 时,您正在转移列表的所有权,您确定之后不会删除它(或者它不会自动删除)吗?

【讨论】:

  • 是的,后来被删除了,但是现在我在普通的QVector上操作,效果还是一样的。现在我正在将元素复制到一个新的 QVector。元素列表存在于窗口中,它调用新窗口的构造函数并自行销毁。完全按照这个顺序。
  • 说真的,您认为我可以根据该评论给您答案吗?您可能应该将此问题标记为已解决,因为问题已被发现,并在您放置当前代码的位置打开一个新问题
【解决方案2】:

list_=list; 更改为list_ = new QVector(list)。也许您的向量在您的班级之外的某个地方被修改?你只是保持对你方法的向量的引用,看起来复制就是你想要的。

更新
我看到你的班级是单身人士。永远记得在将一个类设为单例之前三思而后行——这不是你想在代码中包含的东西,应该尽可能避免。

【讨论】:

  • 是的,我使用的是单例,但我之前写过关于相同的程序。唯一的区别是 Turniej 类不是模板类,我需要它,而且一切运行良好。
  • 您的单例似乎有几个实例 - 每个 T 一个。可能问题出在哪里?
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多