Qlist 拷贝构造产生的原因

新手上路,请多包涵

1) 如下代码,RowOfData rowData = tableData[row]; 触发RowOfData拷贝构造
2)tableDatarow = item; 此时tableDatarow也会触发QtParameter拷贝构造,并调用 QList<T>::node_copy执行深拷贝,是为什么呢,是编译器
影响的么,去掉RowOfData rowData = tableData[row];就不会执行QtParameter拷贝构造与 QList<T>::node_copy。
3)看似多余的RowOfData rowData = tableData[row];,为什么会影响后面Qistx的深拷贝呢,是因为RowOfData rowData = tableData[row];调用了浅拷贝,编译器为避免出错,让tableDatarow执行了拷贝构造么。不是很确定,很诡异的一个问题。

QtParameter::QtParameter( const QtParameter& rhs) :QVariant(rhs)
{
}
            class RowOfData : QList<QtParameter>
            {
               public:
                  RowOfData(const RowOfData& rhs);                 
               private:            
            }

            class TableData
            {
               public :
                    TableData();
                    virtual ~TableData();
                    bool setItem(int row, int col, QtParameter item);                    
              protected:
                    QStringList         columnHeader;
                    QStringList         rowHeader;
                    QStringList         rowFooter;
                    QList< RowOfData >  tableData;              
            }   

   bool TableData::setItem(int row, int col, QtParameter item)
    {
              if(row<rowCount())     
               {                
                    RowOfData rowData = tableData[row];
            /*useless here and impact the tableData[row][col] copy constructer× */            
                    if( col < tableData.at(row).size() )
                    {
                        tableData[row][col] = item;
                    }
                }
    }                     
                        
        template <typename T>
        Q_INLINE_TEMPLATE void QList<T>::node_copy(Node *from, Node *to, Node *src)
        {
            Node *current = from;
            if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) {
                QT_TRY {
                    while(current != to) {
                        current->v = new T(*reinterpret_cast<T*>(src->v));
                        ++current;
                        ++src;
                    }
                } QT_CATCH(...) {
                    while (current-- != from)
                        delete reinterpret_cast<T*>(current->v);
                    QT_RETHROW;
                }
        ...
        }
阅读 4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题