gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:41:10 24 4
gpt4 key购买 nike

我是 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() 而不是针对字符代码的笨拙、不可移植的不等式检查会更好。)

关于c++从不变函数返回时断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com