来自数组的 QList 请求项未提供正确的参考

Posted

技术标签:

【中文标题】来自数组的 QList 请求项未提供正确的参考【英文标题】:QList request item from array not giving correct reference 【发布时间】:2020-06-05 10:26:14 【问题描述】:

如果标题措辞不正确,我们深表歉意 - 我不太确定是什么导致了问题

我正在测试 QList 数组访问并遇到了这个问题。这是使用引用 QList append() 函数和 QList[] 运算符的直接示例。

目标: 我试图找出是否将相同的对象(使用 new 创建)添加到 2 QList<int> 并更改其中一个对象(或引用)是否会更改另一个。

鉴于我的示例和以下输出,我的发现似乎表明这不是真的:

// Some structure to simluate an object
struct IntStream 
    int i;
;

// Create our lists
QList<IntStream> newlist = QList<IntStream>();
QList<IntStream> another = QList<IntStream>();

// Add 3 IntStream objects to the 2 lists using the same object, printing out the object and its reference
for (int i = 0; i < 3; i++) 
    IntStream *s = new IntStream;
    s->i = i;
    newlist.append(*s);
    another.append(*s);
    qDebug() << QString("%1[%2] = %3 (").arg("newList", QString::number(i), QString::number(i)) << &another[i] << ")";
    qDebug() << QString("%1[%2] = %3 (").arg("another", QString::number(i), QString::number(i)) << &another[i] << ")";


// Alter bject at index 1 with some arbitrary value
for (int i = 0; i < 3; i++) 
    if(newlist.at(i).i == 1) 
        qDebug() << "another[1] = " << &another[i];
        qDebug() << "newList[1] = " << &newlist[i];
        another[i].i = 4;
    


// Here, I should see the 2 values match, they do not
qDebug() << QString("%1 == %2 ???").arg(QString::number(newlist.at(1).i), QString::number(another.at(1).i));

这个的输出是:

"newList[0] = 0 (" 0x27c75f88 )
"another[0] = 0 (" 0x27c75f88 )
"newList[1] = 1 (" 0x27c755d0 )
"another[1] = 1 (" 0x27c755d0 )
"newList[2] = 2 (" 0x27c75630 )
"another[2] = 2 (" 0x27c75630 )
another[1] =  0x27c755d0
newList[1] =  0x27c76ef0
"1 == 4 ???"

我应该期待看到4 == 4 还是我在某处做错了什么?

注意事项:

我使用的是T &amp;QList::operator[](int i),而不是const T &amp;QList::operator[](int i) const 创建 new 对象而不是存储作用域对象

【问题讨论】:

【参考方案1】:
qDebug() << QString("%1[%2] = %3 (").arg("newList", QString::number(i), QString::number(i)) << &another[i] << ")";
qDebug() << QString("%1[%2] = %3 (").arg("another", QString::number(i), QString::number(i)) << &another[i] << ")";

您比较了两次 &another[i]。你应该在第一行写 &newlist[i]。

当你调用 newlist.append(*s);您制作了 IntStream 实例的副本。

为了满足您的需求: “我正在尝试确定将相同的对象(使用 new 创建)添加到 2 个 QList 并更改其中一个对象(或引用)是否会更改另一个。” 使用 shared_ptr 在多个列表之间共享您的实例。

类似:

struct IntStream 
    int i;
;

// Create our lists
QList<std::shared_ptr<IntStream >> newlist = QList<std::shared_ptr<IntStream >>();
QList<std::shared_ptr<IntStream >> another = QList<std::shared_ptr<IntStream >>();

// Add 3 IntStream objects to the 2 lists using the same object, printing out the object and its reference
for (int i = 0; i < 3; i++) 
    std::shared_ptr<IntStream > s = std::make_shared<IntStream >();
    s->i = i;
    newlist.append(s);
    another.append(s);

【讨论】:

以上是关于来自数组的 QList 请求项未提供正确的参考的主要内容,如果未能解决你的问题,请参考以下文章

来自凭据提供程序 DLL 的 HTTPS 请求

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度

处理servlet中的多个请求,并为每个请求提供正确的响应

列表项未显示正确的文本

如何使用标志变量为旨在搜索数组以查找通过用户输入提供的字符串的程序生成输出?

Emacs 多项未正确显示特殊字符