Назначение в функциях Const C ++

У меня есть задание, в котором я должен написать простой класс. Этот класс должен содержать массив строк и содержать перегрузку оператора ‘+’, который объединяет элементы двух массивов в новый массив и возвращает его.

Кроме того, эта функция должна быть «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;
}

0

Решение

Оператор сложения должен возвращать новый объект, а не ссылку на один из его операндов. Это не имеет никакого смысла для 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;
}
4

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

Оператор + не должен возвращать ссылку на объект, а скорее новый объект. Не путай +() с +=() оператор. Последний применяет операцию к lval выражения, а первый возвращает новый объект.

Вы должны вернуть:

FirstClass FirstClass::operator+(const FirstClass& add) const

Предполагая это, вы можете понять, почему const требование имеет смысл. Без этого вам будет позволено изменить любую из переменных неявного this объект, который не допускается. Ошибка компиляции точно говорит вам: «посмотрите, что вы пытаетесь изменить размер, но вы должны вернуть новый объект, чтобы операнды не могли быть изменены».

1

По вопросам рекламы ammmcru@yandex.ru