【发布时间】:2019-05-16 02:49:29
【问题描述】:
下面给出了代码概要来演示问题,感谢您的时间。
在
RowOfData rowData = tableData[row];,RowOfData将调用复制构造函数并执行浅复制。-
在
tableData[row][col] = item;,QtParameter复制构造函数将被tableData[row][col]赋值操作调用,随后将调用QList<T>::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;
}
...
}
【问题讨论】:
-
我正在考虑在“tableData[row][col]”中为 QList 触发深层复制执行 [] 操作。但是问题是为什么删除 RowOfData rowData = tableData[row]; ,没有深拷贝操作。
-
我写了一个答案。如果它解决了问题,请考虑投票/接受它! (stackoverflow.com/help/someone-answers)
标签: c++ qt copy-constructor qlist