2015-02-07 48 views
1

回报C++断言失败我很新的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

更好地利用['标准::因而isalpha (char)'](http://en.cppreference.com/w/cpp/string/byte/isalpha)及其[兄弟姐妹](http://en.cppreference.com/w/cpp/string/byte) 。 – Walter 2015-02-07 16:25:04

+0

代码是如何工作的? “n1.Set(” * A_2 “);”类名称没有称为Set的方法。该代码不应该编译。 – thang 2015-02-07 16:26:12

+0

名称已设置和获取方法,我只是没有包括他们上面。 – Nena 2015-02-07 16:48:23

回答

2

当然,它断言,失败,因为你的"*a_2"字符串不是一个有效的名称(它不以字母或下划线开头)。

如果您不想声明失败,则允许名称以星号"*"开头,或者使用以字母或下划线开头的名称。

(顺便说一下,由沃尔特指出的那样,你会好得多使用isalpha(),而不是对字符代码的哈克,不可移植的不平等检查。)

+0

这解决了我的问题。我认为,如果是非有效名称,输出将被打印,然后程序将继续。 – Nena 2015-02-07 16:53:17

+0

@NenaB我想知道你是怎么想的。你有源代码。你已经阅读过'assert()'的文档。我的意思是...你呢? – 2015-02-07 17:12:58

+0

我已阅读文档,但显然不是很彻底,因为我记得它错了...下一次我会更好地搜索之前张贴在这里。 – Nena 2015-02-08 12:00:07

1

尝试

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

谢谢,这是一个更好的方法来做检查! – Nena 2015-02-07 16:50:35

+0

如果您发现此答案有帮助,您为什么不喜欢它? – Walter 2015-02-08 19:24:14

+0

因为我是新来的stackoverflow,我没有足够的声誉去做... – Nena 2015-02-08 20:37:12