我的代码中有一些问题:
Employees.cpp :
void Employees::delete_employee()
{
int employee_number;
cout<<"\n..."<<endl<<endl;
cout<<"Give me the number:";
cin>>Employee_number;
for(std::vector<EmployeeStruct>::size_type i = 0; i != lista.size(); i++)
{
if (employee_number = lista[i].Employee_number)
{
lista.erase(lista.begin() + i);
}
}
cout<<"..."<<endl<<endl;
cout<<"--------------------------------"<<endl;
}
当我编译我的代码时,我看到类似的东西:警告:建议用作真值的括号括号[-Whatarentheses] 我真的不知道如何处理它。也许这不是一个严重的问题,但我的计划并不像我想的那样工作。 (此代码应删除员工)
在 main.cpp 中,我有:
case 4:
{
Pracownicy p;
p.usun_pracownika();
}
break;
也许有人可以帮助我。
答案 0 :(得分:2)
我真的不知道该怎么做。
这取决于你打算做什么。
如果您没有打算分配,而是比较相等,那么您应该修复代码以使用相等运算符:==
如果您打算分配,那么您可以:a)忽略警告或b)添加括号,告诉编译器您确实打算进行分配并且这不是错误。或者由Christian Hackl评论c)将分配和比较分成两个语句以提高可读性。
您的代码中还有另一个错误。擦除会移动剩余的元素。下一个元素不再是i++
,因此您最终会在擦除后跳过元素。如果擦除多个元素,这也是低效的。有关更好的方法,请参阅erase-remove idiom。
答案 1 :(得分:0)
我认为这是一个非常常见的错误:
if (employee_number == lista[i].Employee_number)
^^
{
lista.erase(lista.begin() + i);
}
您在此处混淆了==
赋值运算符的布尔检查=
运算符,无论是拼写错误还是错误。
答案 2 :(得分:0)
我真的不知道该怎么做。
使用等于比较而不是分配,这是警告在大多数情况下最终建议的内容:
if (employee_number == lista[i].Employee_number)
// ^^
或使用括号
清楚地说明你想要的内容if ((employee_number = lista[i].Employee_number))
虽然编译器没有这么好的警告。
答案 3 :(得分:0)
一个简单的错误。你写道:
if (employee_number = lista[i].Employee_number)
写
if (employee_number == lista[i].Employee_number)
答案 4 :(得分:0)
您身边的主要问题是无意中使用了赋值运算符=
而不是预期的比较==
。
在语言方面,这个常见问题是通过从原始C继承的两个风险增强功能启用的,即正式条件接受任何转换为{{1}的对象而且,为了支持多任务,赋值是一种表达而不是一种陈述。
您很幸运能够使用编译器和产生警告的选项进行编译:无法保证此类警告。
保证获取错误的方法是让左侧是一个无法分配的表达式,例如
bool
。在给定的情况下,而不是
const
你可以做得更安全
void Employees::delete_employee()
{
int employee_number;
cout<<"\n..."<<endl<<endl;
cout<<"Give me the number:";
cin>>Employee_number;
for(std::vector<EmployeeStruct>::size_type i = 0; i != lista.size(); i++)
{
if (employee_number = lista[i].Employee_number)
{
lista.erase(lista.begin() + i);
}
}
cout<<"..."<<endl<<endl;
cout<<"--------------------------------"<<endl;
}
如果使用auto fail() -> bool ...;
auto line_from( istream& stream )
-> string
{
string line;
getline( stream, line )
or fail();
return line;
}
void Employees::delete_employee()
{
cout<<"\n..."<<endl<<endl;
cout<<"Give me the number:";
int const Employee_number = to_string( line_from( cin ) );
for(std::vector<EmployeeStruct>::size_type i = 0; i != lista.size(); i++)
{
if (employee_number == lista[i].Employee_number)
{
lista.erase(lista.begin() + i);
}
}
cout<<"..."<<endl<<endl;
cout<<"--------------------------------"<<endl;
}
代替==
,则此代码根本不会编译,而使用=
的奖励有助于避免从{{1}输入值时出现的许多常见问题}}
另一种修复方法是通过宏重新定义getline
,或定义一个扩展为安全使用cin
的宏。第一种是技术上可行的,但如果包含任何标准库头,则形式上是未定义的行为,通常就是这种情况。第二个是代码的严重(通常是不可接受的)丑化,并将使维护成为一场噩梦。我记得曾经为其中一个Unix shell做过类似的事情。由于除了原始程序员之外没有人理解任何代码,因此它的寿命很短。