У меня есть задание, в котором я должен написать простой класс. Этот класс должен содержать массив строк и содержать перегрузку оператора ‘+’, который объединяет элементы двух массивов в новый массив и возвращает его.
Кроме того, эта функция должна быть «const», где я столкнулся с проблемами. При попытке изменить атрибут класса «size» и массив, который он содержит, я получаю ошибки. Я также получаю сообщение об ошибке при попытке вернуть объект. Я понимаю, что причина первых двух ошибок в том, что я объявил функцию ‘const’, но у меня вопрос: как правильно переназначить эти значения внутри метода const?
Не срывайся со мной слишком плохо, я только начал изучать C ++, и эти концепции немного новы для меня. Я пытался исследовать предмет, но я не нашел никаких полезных ответов. При этом мне действительно нужно, чтобы эта функция работала, поэтому любая помощь будет высоко цениться.
Вот класс:
class FirstClass{
private:
string* sList;
unsigned int _size;
public:
FirstClass(const unsigned int initSize = 1);
// copy, assignment, and destructor
FirstClass& operator+(const FirstClass& add)const;
};
FirstClass::FirstClass(const unsigned int initSize):_size(initSize)
{
sList = new string[initSize];
return;
}FirstClass& FirstClass::operator+(const FirstClass& add)
const{
if(add.sList){
int prevSize = this->_size;
this->_size += add._size; // can't do this
string newList[this->_size];for(int a=0; a<prevSize; a++){
newList[a] = this->sList[a];
}
for(int b=0; b<add._size; b++){
sList[b+prevSize] = add.sList[b];
}
delete [] sList;
this->sList = newList; // or this
}
return *this; // or this
}
РЕДАКТИРОВАТЬ: Спасибо за быстрый ответ и прояснение того, что я делал. Вот мой пересмотренный код.
FirstClass FirstClass::operator+(const FirstClass& add)
const{
FirstClass ma(this->_size + add._size);
if(add.sList){
for(int a=0; a<this->_size; a++){
ma.sList[a] = this->sList[a];
}
for(int b=0; b<add._size; b++){
ma.sList[b+this->_size] = add.sList[b];
}
}
return ma;
}
Оператор сложения должен возвращать новый объект, а не ссылку на один из его операндов. Это не имеет никакого смысла для A+B
модифицировать A
или же B
Или верните ссылку на один из них.
Имея это в виду, легко увидеть, как оператор может быть постоянным.
FirstClass operator+(const FirstClass& rhs) const;
Вы могли бы реализовать мутирование operator+=
и реализовать operator+
с точки зрения этого:
FirstClass& operator+=(const FirstClass& rhs);
FirstClass operator+(const FirstClass& rhs) const
{
FirstClass ret = rhs;
ret += *this;
return ret;
}
или как не член:
FirstClass operator+(const FirstClass& lhs, const FirstClass& rhs)
{
FirstClass ret = lhs;
ret += rhs;
return ret;
}
Оператор + не должен возвращать ссылку на объект, а скорее новый объект. Не путай +()
с +=()
оператор. Последний применяет операцию к lval выражения, а первый возвращает новый объект.
Вы должны вернуть:
FirstClass FirstClass::operator+(const FirstClass& add) const
Предполагая это, вы можете понять, почему const
требование имеет смысл. Без этого вам будет позволено изменить любую из переменных неявного this
объект, который не допускается. Ошибка компиляции точно говорит вам: «посмотрите, что вы пытаетесь изменить размер, но вы должны вернуть новый объект, чтобы операнды не могли быть изменены».