我对C ++很陌生,所以请耐心等待......
我正在编写一个包含 std :: string 变量的类,我检查它是否是一个有效的C语言标识符。 有效标识符以" _"开头或一封信,并继续使用字母,数字或_"。 此类由以下类NamedObject和Foo使用。
class Name{
std::string name;
protected:
virtual bool Inv(void) const{
if (name[0] >= 'A' && name[0] <= 'Z') return true;
if (name[0] >= 'a' && name[0] <= 'z') return true;
if (name[0] == '_') return true;
std::cout << "String input is not a valid identifier."<< std::endl;
return false;
}
public:
Name(){}
Name(std::string _name) : name(_name){ assert(Inv()); }
Name(Name& n) : name(n.name) { assert(Inv()); }
//more constructors and methods
};
class NamedObject{
Name objectsName;
public:
//Constructors & Destructor
NamedObject() : objectsName(Name()) {}
NamedObject(Name name) : objectsName(name) {}
~NamedObject() {}
//Accessors-Modifiers
const Name& Get(void) const { return objectsName; }
void Set(const Name name) { objectsName = name; }
};
class Foo : public NamedObject {
public:
Foo() : NamedObject() {}
Foo(Name name) : NamedObject(name) {}
~Foo();
};
当我尝试代码时:
Name n1("a_1");
Foo *f1 = new Foo(n1);
n1.Set("*a_2");
Foo *f2 = new Foo(n1);
我收到以下错误: 断言失败:Inv()第64行(第二个断言行) 我一直试图用Inv()找到问题,但没有提出任何问题。
答案 0 :(得分:2)
肯定断言失败是因为您的"*a_2"
字符串不是有效名称(它不以字母或下划线开头)。
如果您不想断言失败,那么要么允许名称以星号"*"
开头,要么使用以字母或下划线开头的名称。
(顺便说一下,正如Walter所指出的,使用isalpha()
而不是对字符代码进行hacky,非便携式不等式检查,你会好得多。)
答案 1 :(得分:1)
尝试
virtual bool Inv() const
{
return std::isalpha(name[0]) || name[0] == '_';
}