c ++变量保持重置而不是递增?

时间:2014-02-28 01:09:02

标签: c++ arrays counter

void RetailerOrder::addItem(Product* p)
{
    bool space = false;
    int counter = 0;
    while ((space == false) && (counter < manifest.size()))
    {
        if (manifest[counter] == nullptr);
        {
            manifest[counter] = p;
            space = true;
        }
        counter++;
    }

    if (space == false)
    {
        cout << "no space" << endl;
    }
}

为什么每次通过while循环时计数器都会重置为零?如果按原样使用它,只有我输入的最后一个产品存储在数组中,因为i始终是1.有没有办法让计数器增加。

1 个答案:

答案 0 :(得分:0)

if (manifest[counter] == nullptr);  // << see here
{
    manifest[counter] = p;
    space = true;
}

if语句末尾的分号表示“如果条件,什么都不做”。

然后,遵循的括号范围始终执行

应该是:

if (manifest[counter] == nullptr)
{
    manifest[counter] = p;
    space = true;
}

顺便说一句,我不喜欢这样的事情:

if (space == false) ...

因为,如果您智能地命名布尔值,则可以避免比较:

if (! foundSpace) ...

智能命名意味着布尔变量本身应该是可读的,例如foundSpacehaveFinisheduserIsClinicallyInsane。一旦它,你根本不需要将它与布尔常量进行比较。

这大大减少了代码大小,并避免了在你不知道何时停止将布尔值与常量进行比较时的减少ad-absurdum情况:

if ((((haveFinished == true) == true) != false) == true) ...

除了 second 之外,我在查看代码时非常重视我的垂直空间,并且有一些方法可以简化代码,使其更短,并且在我的意见中,更容易理解。

由于您仅使用space作为插入项目并过早退出循环的方法,因此您可以使用以下内容:

void RetailerOrder::addItem (Product* p) {
    // Check every possible slot.

    for (int i = 0; i < manifest.size(); i++) {
        // If one free, use it and exit.

        if (manifest[i] == nullptr) {
            manifest[i] = p;
            return;
        }
    }

    // None were free, complain bitterly.

    cout << "no space" << endl;
}

尽管如此,这是我的风格方法,如果你不同意,你应该随意忽略它。

“多个返回点很糟糕”的人群可能不喜欢它,但这通常是因为他们不理解为什么被认为是可疑的原因,无法轻易看到许多代码路径。有了这个尺寸的功能,这不是一个真正的问题。