关于QLIST类型实例复制构造函数的一个奇怪问题



代码的概述以证明问题,谢谢您的时间。

  1. RowOfData rowData = tableData[row];上,RowOfData将调用复制限制器,并执行浅副本。

  2. tableData[row][col] = item;上,QtParameter COPY COMPLUCTER将通过tableData[row][col] Assingment操作调用,然后将调用QList<T>::node_copy,以便将新的条目tableData[row][col]分配。

    • 问题:为什么tableData[row][col]会调用QtParameter复制构造?

    • 顺便说一句,QtParameter在函数末尾破坏rowData时,tableData[row][col]复制构造不会被调用。

类:

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

一种可能性是,当成员函数 TableData::setItem由类型QtParameter的对象调用时,因为该函数不是通过参考来对象,则必须通过引用来创建一个类型QtParameter的对象。复制从上一个构造!

如果要避免这种情况,请通过参考(最好是const One(进行:

bool TableData::setItem(int row, int col, const QtParameter& item)

向前移动,在函数中向前移动:

RowOfData rowData = tableData[row];

可能性很小,如果这些不是迭代器/指针的某种类型/s的最低水平,这也可能是源。

最后在:

tableData[row][col] = item;

您提到的另一种可能性可能是分配运算符本身为tableData[row][col]类定义的方式。请记住,如果未声明为:

,则分配运算符也是一个函数
assigned_to & operator=(const assigned_from &)

例如:

assigned_to & operator=(assigned_from)

与第一种情况相同,将在分配操作员内构造分配的对象。

没有给出许多信息,如果您指的是QList<T>::node_copy,则复制构造函数也可以发生在:

中。
current->v = new T(*reinterpret_cast<T*>(src->v));

这是对 a 复制构造函数的明确调用。但是,由于没有提供有关类型的信息,我不能确定,这是复制构造函数的位置。

也是您提供有关QList<QtParameter>的一些信息,我对为什么在rowData遭到破坏时不会发生"深副本"。

最新更新