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.有没有办法让计数器增加。
答案 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) ...
智能命名意味着布尔变量本身应该是可读的,例如foundSpace
或haveFinished
或userIsClinicallyInsane
。一旦它,你根本不需要将它与布尔常量进行比较。
这大大减少了代码大小,并避免了在你不知道何时停止将布尔值与常量进行比较时的减少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;
}
尽管如此,这是我的风格方法,如果你不同意,你应该随意忽略它。
“多个返回点很糟糕”的人群可能不喜欢它,但这通常是因为他们不理解为什么被认为是可疑的原因,无法轻易看到许多代码路径。有了这个尺寸的功能,这不是一个真正的问题。