• 6561阅读
  • 9回复

关于push_back的问题 [复制链接]

上一主题 下一主题
离线shifan
 
只看楼主 倒序阅读 楼主  发表于: 2009-08-14
std::vector<std::vector<QTableItem> > tableDomain;    


void inputTable::addRow()
{
    vector<QTableItem>  currentRow;    
    addDialog *addRowDialog=new addDialog();
    if(addRowDialog->exec()==QDialog::Accepted)
    {
        QTableItem difType(table,QTableItem::Never);
        currentRow.push_back(difType);
        cout<<"To this is well 1"<<endl;
        
        difType.setText(addRowDialog->getDate());
        currentRow.push_back(difType);
        cout<<"To this is well 2"<<endl;
    
        difType.setText(addRowDialog->getField());
        currentRow.push_back(difType);
        cout<<"To this is well 4"<<endl;
    
        difType.setText(addRowDialog->getSpecial());
        currentRow.push_back(difType);
        cout<<"To this is well 5"<<endl;
    
        difType.setText(addRowDialog->getIncome());
        currentRow.push_back(difType);
        cout<<"To this is well 6"<<endl;

        difType.setText(addRowDialog->getOutput());
        currentRow.push_back(difType);
        cout<<"To this is well 7"<<endl;

        difType.setText(QString::number((addRowDialog->getIncome().toDouble()-addRowDialog->getOutput().toDouble())));
        currentRow.push_back(difType);
        cout<<"To this is well 8"<<endl;

        difType.setText(addRowDialog->getPerson());
        currentRow.push_back(difType);
        cout<<"To this is well 9"<<endl;
    
        difType.setText(addRowDialog->getAddition());
        currentRow.push_back(difType);
        cout<<"To this is well 10"<<endl;
    }
    tableDomain.push_back(currentRow);
    paintTable();
}
相关定义和程序段如上,编译可以通过。但是一运行就显示一堆
QGvector::remove: index -11 out of range
百思不得其解,求大侠答疑解惑。
离线xtfllbl

只看该作者 1楼 发表于: 2009-08-14
数组越界了,就这么简单,好好看看。
上海欢迎您
离线reback
只看该作者 2楼 发表于: 2009-08-14
有问题的代码没贴出来
离线foxyz

只看该作者 3楼 发表于: 2009-08-14
->
QTableItem difType(table,QTableItem::Never);
所有的这部分都改成
    QTableItem difType = new QTableItem(table,QTableItem::Never);
        currentRow.push_back(*difType);
        cout<<"To this is well 1"<<endl;

        difType = new QTableItem(table,QTableItem::Never);
        difType->setText(addRowDialog->getDate());
        currentRow.push_back(*difType);
        cout<<"To this is well 2"<<endl;
    ......
        要么改成
    QTableItem difType[10] ;//前提是有不带参数构造函数
    .....

你的写法错误就在于,搞来搞去都只有一个对象,肯定报错了.
离线shifan
只看该作者 4楼 发表于: 2009-08-14
Re:->这个方案不行
引用第3楼foxyz于2009-08-14 12:08发表的 -> :
QTableItem difType(table,QTableItem::Never);
所有的这部分都改成
    QTableItem difType = new QTableItem(table,QTableItem::Never);
        currentRow.push_back(*difType);
        cout<<"To this is well 1"<<endl;
.......

我按照这个方案改过之后,结果还是一样的,没有什么改善,还是那个报错。我想我原来只用一个TableItem应该没有什么问题,因为vector在push_back()时使用的是复本。
离线shifan
只看该作者 5楼 发表于: 2009-08-14
引用第1楼xtfllbl于2009-08-14 09:10发表的  :
数组越界了,就这么简单,好好看看。

我始终看不出哪里越界了,因为vector在push_back的时候大小会自动加一,应该不需要我们来操心这个吧。。。。
离线shifan
只看该作者 6楼 发表于: 2009-08-14
引用第1楼xtfllbl于2009-08-14 09:10发表的  :
数组越界了,就这么简单,好好看看。

应该是push_back的问题,因为把push_back注释掉就没有问题了(当然也没有功能了,呵呵)。
离线foxyz

只看该作者 7楼 发表于: 2009-08-14
从代码来说,我的方案肯定行。
同时给你个建议,vector最好使用对象指针:
std::vector<std::vector<QTableItem*>* > tableDomain

还有,你还是用QVector比较合适。
离线shifan
只看该作者 8楼 发表于: 2009-08-16
谢谢大侠的提醒。我去翻语法书发现使用vector要求类能够复制,但是QTableItem没有复制构造函数,也没有重载operator=,所以不能使用vector.这样推断的话,QT中应该有很大数量的类都不能用vector的。
离线jorneyr

只看该作者 9楼 发表于: 2009-08-16
vector<QTableItem>  currentRow;  
这个定义是错的, 因为QtGui中的类的对象是不能复制的. 而容器容纳的对象是要满足几个要求: 1. 有默认构造函数. 2. 能复制. 3. 好像还要能复制构造.
仔细看Qt容器那一部分的说明.
快速回复
限100 字节
 
上一个 下一个