下面给出代码概要以演示该问题,谢谢您的时间。
在RowOfData rowData = tableData[row];
,将调用RowOfData
复制构造函数,它执行浅表复制。
在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;
}
答案 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
被破坏时为什么没有进行“深层复制”。