以下是代码概述,用于演示问题。感谢您的时间。
1. 在 "RowOfData rowData = tableData[row];" 处,将调用 RowOfData 的复制构造函数并执行浅拷贝。
2. 在 "tableData[row][col] = item;" 处,会由 tableData[row][col] 赋值操作调用 QtParameter 的复制构造函数,并接着调用 QList::node_copy,以便分配新条目 tableData[row][col]。
问题:
为什么 tableData[row][col] 会调用 QtParameter 的复制构造函数?
顺便说一下,在函数结束时析构 rowData 时,不会为 tableData[row][col] 调用 QtParameter 的复制构造函数。
类:
1. 在 "RowOfData rowData = tableData[row];" 处,将调用 RowOfData 的复制构造函数并执行浅拷贝。
2. 在 "tableData[row][col] = item;" 处,会由 tableData[row][col] 赋值操作调用 QtParameter 的复制构造函数,并接着调用 QList::node_copy,以便分配新条目 tableData[row][col]。
问题:
为什么 tableData[row][col] 会调用 QtParameter 的复制构造函数?
顺便说一下,在函数结束时析构 rowData 时,不会为 tableData[row][col] 调用 QtParameter 的复制构造函数。
类:
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;
}
...
}