关于QList类型实例的副本构造函数的一个奇怪问题

时间:2019-05-16 02:49:30

标签: c++ qt copy-constructor qlist

下面给出代码概要以演示该问题,谢谢您的时间。

  1. RowOfData rowData = tableData[row];,将调用RowOfData复制构造函数,它执行浅表复制。

  2. tableData[row][col] = item;QtParameter拷贝操作将调用tableData[row][col]复制构造器,并且随后将调用QList<T>::node_copy,因此新条目{ {1}}将被分配。

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

    • BTW,在函数的末尾QtParameter被销毁时,QtParameter不会被调用tableData[row][col]

课程:

rowData

成员功能:

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

1 个答案:

答案 0 :(得分:1)

一种可能性是,当成员函数TableData::setItem被类型为QtParameter的对象调用时,由于该函数不是通过引用来获取它,因此必须创建类型为QtParameter的对象通过从上一个副本构造而在函数内部!

如果要避免这种情况,请参考一下(最好是const one):

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

向前移动,位于函数内:

RowOfData rowData = tableData[row];

如果它们不是最低级别的某些迭代器/指针的类型,则可能性很小。

最后在:

tableData[row][col] = item;

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

assigned_to & operator=(const assigned_from &)

例如:

assigned_to & operator=(assigned_from)

与第一种情况一样,将在赋值运算符内部复制构造assigned_from对象。

许多信息都没有给出,如果您是指QList<T>::node_copy所指的“深度复制”,则复制构造函数也可以在其中简单地出现在以下位置:

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

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

此外,除非您提供有关QList<QtParameter>的信息,否则我无法说出为什么rowData被破坏时为什么没有进行“深层复制”。