从不变函数返回时的c++断言失败

c++ Assertion failure on return from invariant function

本文关键字:c++ 断言 失败 返回 函数      更新时间:2023-10-16

我对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()的问题,但没有找到任何结果。

它断言肯定会失败,因为"*a_2"字符串不是有效名称(它不是以字母或下划线开头)。

如果您不想断言失败,那么允许名称也以星号"*"开头,或者使用以字母或下划线开头的名称。

(顺便说一句,正如Walter所指出的,你最好使用isalpha(),而不是针对字符代码的黑客、不可移植的不等式检查。)

尝试

virtual bool Inv() const
{
  return std::isalpha(name[0]) || name[0] == '_';
}