0

簡単なクラスを書かなければならない課題があります。このクラスは、文字列の配列を保持し、2 つの配列の要素を新しい配列に結合して返す '+' 演算子のオーバーロードを含める必要があります。

さらに、この関数は「const」である必要があり、ここで問題が発生しました。クラスの「サイズ」属性とそれが保持している配列を変更しようとすると、エラーが発生します。また、オブジェクトを返そうとするとエラーが発生します。最初の 2 つのエラーの原因は、関数「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

1

+ 演算子は、オブジェクトへの参照ではなく、新しいオブジェクトを返す必要があります。オペレーターと混同+()しないでください。+=()後者は操作を式の lval に適用し、最初のものは新しいオブジェクトを返します。

あなたは返す必要があります:

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

constこれを仮定すると、要件に意味がある理由を理解できます。それがなければ、許可されてthisいない暗黙的なオブジェクトの変数を変更することが許可されます。コンパイルエラーは、「サイズを変更しようとしているように見えますが、新しいオブジェクトを返す必要があるため、オペランドを変更してはなりません」ということを正確に伝えています。

于 2013-04-25T16:50:18.753 に答える