ошибка: передача константной строки в качестве аргумента push_back

0

Я получаю титульную ошибку в следующем коде в строке 19

#include <string>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;

namespace robot_name 
{
    vector<string> allRobotNames;
    class robot
    {
        public:
            string robotName;

            string name() const
            {
                if(robotName.empty())
                {
                    robotName.push_back('a'+rand()%26);//this line
                    robotName.push_back('a'+rand()%26);//also here
                    robotName+=to_string(rand()%10) + to_string(rand()%10) + to_string(rand()%10);//and here
                    return robotName;
                }
                else
                {
                    return robotName;
                }
            };

            void reset() const
            {
                allRobotNames.push_back(robotName);
                while(find(allRobotNames.begin(), allRobotNames.end(), robotName)!=allRobotNames.end())
                {
                    robotName="";//here as well
                    robotName.push_back('a'+rand()%26);
                    robotName.push_back('a'+rand()%26);
                    robotName+=to_string(rand()%10) + to_string(rand()%10) + to_string(rand()%10);
                };
            };
    };
};

Кроме того, аналогичные ошибки в строках 20, 21 и 35. Класс const robot_name::robot robot а затем robot.name() вызывается, как показано. Я сделал другой код, где класс создается таким же образом, однако я не получил эту ошибку. Может ли кто-нибудь проверить это на возможные ошибки и рассказать мне о некоторых возможных решениях? Заранее спасибо.

  • 0
    Есть ли причина точки с запятой после всех закрывающих скобок?
  • 2
    Функции-члены name() и reset() объявлены как const но пытаются изменить переменную-член. Не делай этого.
Показать ещё 6 комментариев
Теги:
string

2 ответа

1
Лучший ответ

Функции name и reset - const. Это означает, что вы не можете изменять каких-либо членов внутри этих функций. Например, вы делаете это в функции allRobotNames.push_back.

Либо сделать reset и name неконстантных функций, или объявить robotName, как mutable:

mutable string robotName;

Однако не злоупотребляйте mutable. Только если имеет смысл использовать mutable если вы его используете (например, нет изменений в объекте, который повлияет на пользователя объекта).

Если вы используете mutable чтобы просто изменить значения членов класса, этого недостаточно, чтобы использовать его.

  • 0
    Это избавило меня от ошибки в строке 35, но теперь у меня есть ошибка, non-member allRobotNames cannot be declared mutable.
  • 0
    извини, я сделал оба твоих предложения сразу. Я не поместил все изменяемые имена RobotNames, но я сделал робота изменяемым, а reset () - неконстантным.
Показать ещё 5 комментариев
0

name() и reset() являются постоянными функциями, что означает, что они не могут изменить состояние *this объекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню