0

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

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

这是一些代码:

 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
 };

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

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

当我最终试图通过下面的代码访问 Turniej 类中的 list_ 对象时,我收到了这个错误: QVector::operator[] 中的 ASSERT failure: "index out of range", file .../QtCore/qvector .h,第 356 行

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

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

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

谢谢你的帮助!

4

2 回答 2

0

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

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

于 2013-07-11T11:55:07.400 回答
0

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

于 2013-07-11T11:57:17.987 回答