我有一个包含以下私人成员的课程:
class Student
{
public:
Student(std::string name_ , int const id_);
virtual ~Student();
void addGrade(int const grade2add);//grade above 100
private:
std::string name; //max 20 chars
int const id; //5 digits, only digits
std::vector<int> grades;
static int maxGrade;
static int freq_grades[100];
};
我必须检查id的lentgh是否等于5并且只包含数字。 我用以下方式在构造函数中检查了它:
Student::Student(std::string name_, int const id_): name(name_), id(id_)
{
string idStr=to_string(id);
if (name.size()>=20)
{
throw(121);
//cout<<"Name should be less than 20 chars"<<endl;
}
if (idStr.size()!=5)
{
throw(122);
//cout<<"Id should be 5 nums"<<endl;
}
if (!all_of(idStr.begin(), idStr.end(), ::isdigit))
{
throw(123);
}
}
程序退出,因为大小的条件(输入是12345,所以它认为是合法的)。当我调试并观察isStr.size()时,我得到了#34;尝试获取不在内存中的值的地址。&#34;
答案 0 :(得分:2)
这整个方法都很糟糕。
转换为字符串的整数永远不能包含除数字(或-
)以外的任何内容。这是一个数字。另外,您可以用数字方式检查范围(并处理-
作为其中的一部分)。因此,您的转换毫无意义,导致您的调试变得更加困难。
为什么不只是以下简单的功能?
Student::Student(const std::string& name_, int const id_)
: name(name_)
, id(id_)
{
if (name.empty() || name.size() >= 20)
throw std::runtime_error("Name must have 1-20 chars");
// Require that the ID has exactly five decimal digits (also implies positive)
if (id < 10000 || id > 99999)
throw std::runtime_error("ID must have five decimal digits");
}
现在,当您的代码失败(无人可以重现)时,只需将id
的值输出到控制台,或在id
上设置监视,并将断点放在相关的条件块中。
答案 1 :(得分:0)
如果代码int cost id;
编译了一些奇怪的东西,或许cost
被定义为一个宏?无论如何,我在这里假设你真的是int const id;
。
所以我使用Visual C ++ 2015编译并运行了以下文件,它使用了输入&#34; John&#34;和&#34; 12345&#34;所以你不应该收到错误。
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
class Student
{
public:
Student(std::string name_, int const id_);
private:
std::string name;
int const id;
};
Student::Student(std::string name_, int const id_) : name(name_), id(id_)
{
string idStr = to_string(id);
if (name.size() >= 20)
{
throw(121);
cout<<"Name should be less than 20 chars"<<endl;
}
if (idStr.size() != 5)
{
throw(122);
cout<<"Id should be 5 nums"<<endl;
}
if (!all_of(idStr.begin(), idStr.end(), ::isdigit))
{
throw(123);
}
}
int main()
{
string n = "";
cin >> n;
int i = 0;
cin >> i;
Student s {n, i};
cin.ignore(2);
}
您使用的是哪种编译器/操作系统?其他C ++代码有效吗?也许您的编译器已损坏,或者您未显示的代码的其他部分出现问题。更多信息非常有用!