【问题标题】:Why are my List values being overwritten?为什么我的列表值被覆盖?
【发布时间】:2013-10-21 00:49:42
【问题描述】:

我目前创建了一个小程序来了解列表。我允许用户将随机整数添加到列表中。只需使用DList.insert(number, position) 就可以很好地添加它们。第一次迭代一切正常,但是当我允许用户输入更多随机数时,它会删除以前的数字,然后添加更多随机数。

由于我是 C++ 新手(很少用它来编程),我认为我犯了一个非常简单的错误。问题似乎是我只是覆盖列表中的旧值而不是添加新值。

这就是我正在做的,

List testList;
//Ask user for a number of elements to add
int num = get_number();
addRandInts(testList, num);
//I then give the user the option to add more or quit

这是我的addRandInts

void addRandInts(List dl, int num) 
{
    int random_max = 999;
    int numIterations = dl.getSize() + num;

    if(num > 0) {
        cout << "Array Size: " << dl.getSize() << endl;
        for(int i = dl.getSize(); i < numIterations; i++) {
            dl.insert(rand() % random_max + 1, i); 
        }
    } else {
        cout << "You need to enter a positive integer" << endl;
    }
    dl.display(cout);
 }

如果需要,我可以提供我的 List.insert(List, pos) 方法。

这是示例输出:

Please enter an integer number for the list: 5
Current Size: 0
42  486  341  527  189

//chance to add more to list
Please enter an integer number for the list: 3
Current Size: 0
740  490  388

所以在第二次运行时,我想我应该有 5 的大小,它应该增加 3。 由于我是指针等的新手,我应该将指针传递给列表而不是列表吗?

【问题讨论】:

  • 你的list实现明显有bug,为什么要发布除了list中的代码以外的所有东西?
  • @DanielKO 我觉得我的错误来自发布的代码。我不是 100% 肯定的,这就是为什么我提到如果需要/请求我会发布我的 insert() 代码。我相信 Jeremy 是正确的,因为我传递的是我的价值而不是参考。
  • 即使你要传递一个副本,插入一个副本也不应该修改原来的,所以你的复制构造函数也有问题;很可能副本的析构函数弄乱了原件。为什么代码显示“数组大小”而输出显示“当前大小”?此外,插入的循环看起来不对,您应该从 0 循环到 numinsert 中的 pos 参数应该是什么意思? List.insert(List, pos) 是什么意思?您是否将列表插入另一个列表?
  • @DanielKO 在将它添加到 SO 时,我正在动态更改它。如果您愿意,我可以添加我的复制构造函数。但是,通过引用测试通过后,输出似乎是正确的。我最近编辑了主要帖子,我相信我修复了我的循环。抱歉,我目前正在学习 C++(以及数据结构),所以很多都是新的。此外, pos 参数是我插入值的位置。在我的情况下,我只是将它们添加到列表的末尾。

标签: c++ arrays list


【解决方案1】:

您将列表按值传递给 addRantInts() 函数,这意味着该函数正在修改列表的副本而不是原始列表。为避免这种情况,请改为通过引用传递:

void addRandInts(List & dl, int num)    // <-- note ampersand!

【讨论】:

  • Java 习惯很难改掉 ;) 感谢您指出这一点。我相信我的 `addRandInts() 函数中也存在逻辑错误(在 for 循环中)。它似乎保留了添加的第一个值,但没有添加附加值。
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 2020-05-12
  • 2011-09-22
  • 1970-01-01
  • 2019-06-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多