Qlist 拷贝构造产生的原因

发布于 2022-09-11 19:56:45 字数 2548 浏览 24 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文