【问题标题】:C++ why struct object values reset back to ZERO at end of loopC ++为什么结构对象值在循环结束时重置为零
【发布时间】:2017-08-02 15:25:53
【问题描述】:

我创建了一个简单的结构对象,它包含 2 个值 - number(特定数字)和 count(数字出现次数的计数器)。

typedef struct matrixMissNumber {
  int number;
  int count = 0;
}

然后我创建了一个名为 missingNumsObjects 的列表来保存这些对象。 missNums 是一个单独的列表,仅包含整数。

list<matrixMissNumber> missingNumsObjects;
for (auto m : missNums)
{
    matrixMissNumber mn;
    mn.number = m;
    missingNumsObjects.push_back(mn);
}

然后我有 3 个 for 循环通过并检查 2 个条件。如果满足这些条件,则 count 递增 1。(我添加了一个 cout 语句用于测试目的)。 我调试了程序,一切正常,直到循环结束。那是 missingNumsObjects 中每个 matrixMissNumber 对象的计数变量重置回 0 时。我不确定这是否是操作不同内存地址或列出指针的问题这就是问题所在。

for (auto m : missingNumsObjects)
{
    for (int x = 0; x < 3; x++)
    {
        for (int y = 0; y < 3; y++)
        {
            if (sudoku[x][y] == 0)
            {
                if (checkRowRule(m.number, x) == false && checkColumnRule(m.number, y) == false)
                {
                    m.count++;
                    cout << m.number << " - " << m.count << endl;
                }
            }
        }
    }
}

下一行打印出循环后 missingNumsObjects 的计数值。这是值返回 0的地方。

for (auto m : missingNumsObjects)
    cout << m.number << " - " << m.count << endl;

这个程序的目的是一个数独求解器。这部分算法检查 3x3 矩阵中是否存在缺失的数字,并检查该数字可以进入 3x3 矩阵中有多少个空白点。

【问题讨论】:

  • 向复制构造函数问好。
  • 不要在 C++ 中使用 typedef struct 构造。这不仅没有必要,而且会产生问题。

标签: c++ list struct sudoku


【解决方案1】:
for (auto m : missingNumsObjects)

这里auto被推导出为matrixMissNumber,所以m是存储在列表中的matrixMissNumber对象的副本。然后更改副本,而不是列表中的对象missingNumsObjects

要解决此问题,请帮助编译器正确推断类型并将循环更改为:

for (auto& m : missingNumsObjects)

【讨论】:

  • 谢谢!现在按计划工作。我最近才重新开始使用 C++,而我现在才开始使用“for (auto x: name)”。下次使用时一定会记住这一点
【解决方案2】:

你最能从中受益的问题其实就在这里

“我调试了程序,一切正常,直到 循环结束”。

在循环结束之前,事情并不完美。你从来没有像以前那样检查过列表的内容,你会注意到它从未改变过。

这样做的寓意是,在调试时,检查应该改变的东西,而不是你分配的东西。

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2014-01-25
    • 2020-09-11
    • 2017-04-18
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多