наследование — С ++ Утверждение сбоя при возврате из инвариантной функции

Я довольно новичок в 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 (), но ничего не придумал.

1

Решение

Конечно, это утверждать-не удается, потому что ваш "*a_2" Строка не является допустимым именем (она не начинается с буквы или подчеркивания).

Если вы не хотите assert-fail, то разрешите имена начинаться со звездочки "*" или используйте имя, начинающееся с буквы или подчеркивания.

(Кстати, как отметил Уолтер, вам было бы гораздо лучше использовать isalpha() вместо хакерских непереносимых проверок неравенства по кодам символов.)

2

Другие решения

Пытаться

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

По вопросам рекламы [email protected]