Помимо ошибки компилятора, на которую уже есть ответ, у вашего кода есть некоторые другие проблемы. (По крайней мере, если предположить, что код, который вы разместили, близок или точно соответствует тому, что вы фактически используете в своем проекте.)
Даже если вы измените _widget_base
на постоянный указатель, эта строка кода является проблемой:
_widget_base = str.substr(pos1, pos2-pos1).c_str();
substr
возвращает временный строковый объект. Результат c_str()
все еще принадлежит этой временной строке. И как пишется эта строка, временный строковый объект будет уничтожен после выполнения строки. Таким образом, проблема заключается в том, что _widget_base
останется указывающим на область памяти, которая была удалена и которая может быть использована повторно в любое время.
У вас также могут быть похожие проблемы с _name
в зависимости от того, что вы передаете в конструктор Widget.
Так что вы могли бы сделать одну из трех вещей с _widget_base
и _name
1) Динамически распределять память самостоятельно, чтобы ею не управляли никакие другие объекты.
std::string temp = str.substr(pos1, pos2-pos1);
_widget_base = new char[temp.length()+1];
strcpy(_widget_base, temp.c_str());
Конечно, вам также необходимо управлять удалением этой памяти в деструкторе вашего виджета. А также возможно перераспределение, если это значение может быть изменено, пока существует виджет.
2) Сделать эти переменные-члены символьными массивами вместо указателей. Таким образом, память - это постоянная часть виджета, которой не нужно управлять. Конечно, вам также нужно определить, насколько большой размер для массивов.
char _name[a big enough value];
char _widget_base[a big enough value];
и затем:
std::string temp = str.substr(pos1, pos2-pos1);
strcpy(_widget_base, temp.c_str());
3) Сделать эти переменные-члены строковыми объектами.
std::string _name;
std::string _widget_base;
и затем:
_widget_base = str.substr(pos1, pos2-pos1);
Этот способ наиболее предпочтителен, поскольку он наиболее надежен и наименее подвержен ошибкам. У вас нет памяти для непосредственного управления, и вам не нужно беспокоиться о значениях, которые слишком велики для хранения.