Почему возникает ошибка, когда я пытаюсь проверить, является ли переменная-член (строка) в классе пустой?

#c 11

#c 11

Вопрос:

Я работаю над проектом, и мне нужно протестировать одну из переменных-членов моего класса, чтобы убедиться, что пользователь действительно ввел строку.

Я также пытался использовать (patronName == «) и (patronName == «»), но безуспешно.

Редактировать: использование » n» исправляет ошибку, но программа завершается, не позволяя пользователю ввести имя.

 std::string Restaurant::getPatronName()
{
     bool controlFlag = true;
do
{
    getline(std::cin,patronName);

    if ((std::cin.fail()) || (patronName == 'n'))  
    {
        std::cout << "You must enter a name!" << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    }
    else
    {
        controlFlag = false;
    }
} while (controlFlag);

return patronName;
}
  

Функция должна считывать и сохранять имя, введенное пользователем в patronName. При попытке сборки я получаю сообщение об ошибке «нет соответствия для ‘operator=='». Может ли это быть связано с тем, что объект, вызываемый в main, является указателем типа Restaurant?

Комментарии:

1. Вы знаете, в чем проблема, так о чем вы вообще спрашиваете? Вы пытаетесь сравнить строку с символом. Поместите n в двойные кавычки: "n" .

2. Использование » n» устраняет ошибку, но программа просто завершается, не позволяя пользователю ввести имя

Ответ №1:

Помимо несоответствия типа между символом 'n' и std::string patronName , мы можем найти вhttps://en.cppreference.com/w/cpp/string/basic_string/getline это std::getline(input, str, delim);

Извлекает символы из входных данных и добавляет их к str до […] следующего доступного входного символа delim , […], в этом случае символ-разделитель извлекается из входных данных, но не добавляется к str .

Таким образом, в первую очередь, не будет никакого 'n' символа, если delim это новая строка.

Вы можете использовать std::basic_string::empty() для проверки, является ли строка пустой.

Ответ №2:

Что происходит с 'n' , так это то, что вы сравниваете строку с символом, который, как я подозреваю, для этого случая не определен operator== . Если вы уверены, что строка не пуста, вы можете вызвать operator[] formerName[0] , который возвращает символ.

Ответ №3:

Вы должны написать patronName == "n" , потому что вы не можете сравнить строку и символ