我有一个作业,我必须写一个简单的类。该类必须包含一个字符串数组,并包含“+”运算符的重载,该运算符将两个数组的元素组合成一个新数组并返回它。
另外,这个函数必须是'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 :(得分:4)
加法运算符应返回一个新对象,而不是对其某个操作数的引用。 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;
}
答案 1 :(得分:1)
+运算符不应返回对象的引用,而应返回新对象。不要将+()
与+=()
运算符混淆。后者将操作应用于表达式的lval,而第一个返回一个新对象。
你应该回复:
FirstClass FirstClass::operator+(const FirstClass& add) const
假设您可以理解为什么const
要求有意义。没有它,您将被允许修改不允许的隐式this
对象的任何变量。编译错误正好告诉你:“看起来你正在尝试修改大小但是你应该返回一个新对象,所以不能修改操作数。”