0

我有一个作业,我必须写一个简单的类。此类必须包含一个字符串数组,并包含“+”运算符的重载,它将两个数组的元素组合成一个新数组并返回它。

此外,这个函数必须是“const”,这是我遇到问题的地方。当试图更改类“大小”属性和它所持有的数组时,我得到了错误。尝试返回对象时也出现错误。我理解前两个错误的原因是因为我已经声明了函数“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;
}
4

2 回答 2

4

加法运算符应该返回一个新对象,而不是对其操作数之一的引用。A+B修改AorB或返回对其中之一的引用没有任何意义。

考虑到这一点,很容易看出运算符如何成为 const。

FirstClass operator+(const FirstClass& rhs) const;

您可以实现 mutating 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; 
}
于 2013-04-25T16:49:39.457 回答
1

+ 运算符不应返回对对象的引用,而应返回新对象。不要+()+=()操作员混淆。后者将操作应用于表达式的 lval,而第一个返回一个新对象。

你应该返回:

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

假设这一点,您可以理解为什么该const要求具有意义。没有它,您将被允许修改不允许的隐式this对象的任何变量。编译错误正是在告诉您:“看起来您正在尝试修改大小,但您应该返回一个新对象,因此不得修改操作数”。

于 2013-04-25T16:50:18.753 回答