2013-07-11 135 views
0

我正在写我的朋友在我的夏季时间的程序,我发生了真正奇怪的问题。QVector <T>运营商=和运营商[]

我分配QVector < T>到其他QVector < T>与运营商=在我自制的模板类,然后尝试检查whethere这第二QVector < T>有任何元素。首先,我检查它的大小和它的好,但是当我使用操作符[]和功能的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 
}; 

然后我调用SETLIST()参考QVector充满Gracz类的2个对象功能

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

而当我终于试图去通过下面的代码Turniej类list_对象,我得到这个错误: ASSERT失败在QVector :: operator []中:“索引超出范围”,文件... /QtCore/qvector.h,线356

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

凡getName()返回一些QString的并且对于某些该方法在Gracz类存在。

我真的很感激任何帮助,因为我坚持了2天,完全不知道发生了什么事情。奇怪的是,我试图谷歌那个错误,但我没有发现任何有关qvector.h特定行中的错误的主题。 我使用Qt 5.0.2与Qt Creator

感谢您的帮助!

+3

你为什么要用指针处理QVector?我的猜测是,当你访问它时,指针是无效的。只需使用一个普通的QVector。 –

+0

将引用返回给解除引用的指针是一个坏主意,你可以解引用NULL或未初始化的指针! – WoJo

+0

我确实改变了指向普通QVectors的指针,并试图在listList()函数中使用operator = list_ = list'并且仍然一样 – Theoden91

回答

0

当您调用SetList时,您正在传输列表的所有权,您是否确实没有删除它(或者它不会自动删除)?

+0

是的,之后被删除,但现在我在纯QVector上运行,效果也是一样的。现在我将元素复制到一个新的QVector中。元素列表存在于窗口中,调用新窗口的构造函数并销毁自身。正是这个顺序。 – Theoden91

+0

说真的,你认为我可以根据评论给你一个答案吗?您应该将此问题标记为已解决,因为已找到问题,并在您放入当前代码的情况下打开一个新问题 –

0

list_=list;更改为list_ = new QVector(list)。也许你的矢量在你课堂以外的某个地方被修改了?你只是保持引用给你的方法,它看起来像复制是你想要的。

已更新
我看到你的班级是单身人士。永远记得在做一个单独的课程之前要三思而行 - 这不是你想要的代码中的东西,应尽可能地避免。

+0

是的,我正在使用singleton,但我之前已经写过关于同一个程序。唯一不同的是,Turniej不是模板课程,我需要它,而且一切都非常好。 – Theoden91

+0

看起来你的单身人士有多个实例 - 每个“T”都有一个实例。也许问题在那里? – SpongeBobFan