从不变函数返回时的c++断言失败
c++ Assertion failure on return from invariant function
我对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] == '_';
}
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- C++ 使用增强正则表达式库时断言崩溃
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 如何将向量断言到特征矩阵
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 使用 Google Test 对自定义断言函数进行单元测试
- 断言"id < 0"在Qt ActiveX中失败
- 初始值设定项列表构造和静态断言
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何断言 CRTP 的函数为最终函数?
- 迭代器跳闸视觉C++ 2017 断言
- 如何在 google test in windows 中管理断言
- 为什么我的Qt程序在断言失败后继续运行?
- 在C++中禁用断言宏
- 宏"断言"会在 C++20 中删除吗?
- 在 constexpr 函数中断言
- 如何在 c++11 中静态断言 std::array 类成员进行排序?