【发布时间】: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= 并且仍然相同