代码的概述以证明问题,谢谢您的时间。
-
在
RowOfData rowData = tableData[row];
上,RowOfData
将调用复制限制器,并执行浅副本。 -
在
。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
遭到破坏时不会发生"深副本"。