0

この代入オーバーロード関数の実行を完了するのを手伝ってください。

指示は次のとおりです。

ソース文字列をコピー先文字列にコピーする代入演算子 (=)。宛先のサイズは、ソースと同じになるように調整する必要があることに注意してください。

加算 (+) 演算子と代入 (=) 演算子の両方がカスケード操作に対応している必要があります。これはString3 = String1 + String2、またはString1 = String2 = String3機能するはずであることを意味します。

ここに私の.cppファイルがあります:

 int MyString::Length()
 {
       int counter(0);

       while(String[counter] != '\0')
       {
            counter ++;
       }
     return (counter);
 }

MyString& MyString::operator=(const MyString& rhs)
{

        if(this != &rhs)
        {

                delete [] String;
                String = new char[rhs.Length()];

             for(int i = 0; i <rhs.Length()+1 ; i++)
            {       
                  String[i] = rhs.String[i];
            }       


        }
        return *this;

}

これは、main.cpp ファイルで次のように呼び出されます。

文字列1=文字列2=文字列3;

私は何かが欠けているように感じます.助けて!!

4

3 に答える 3

4

copy and swap idiom を確認してください。

コードの問題の 1 つは、例外セーフではないことです。基本的な例外保証
すら満たしていません。

新しい操作中にスローされた場合、オブジェクトは完全に使用できない状態のままになります。例外が原因でスタックの巻き戻し中にデストラクタが呼び出された場合、デストラクタがString2回目に削除を呼び出すため、未定義の動作が発生するため、実際には危険な状態にあります。

オブジェクトのすべてのメソッドは、次の 3 つの段階で動作する必要があります。

  1. オブジェクトを変更せずに、スローできるすべての作業を行います。
    • したがって、投げた場合、オブジェクトは良好な状態のままになります。
  2. (1)で作成したデータとオブジェクトのデータを例外的に安全な方法で交換します。
    • これが理由ですswap()メソッドは非スローです
  3. 整理して削除します。
    • オブジェクトが再び一貫した状態にあるため、これがスローされる可能性があります。

コピー アンド スワップのイディオムは、これらの手順を使いやすい手法でうまくカプセル化しています。

于 2012-04-28T21:27:09.750 に答える
3

だと思いStringますchar*。おそらくSize、新しい長さである を、新しい文字列である rhs の長さに設定する必要があります。したがってrhs.Size、そうである可能性が高い this->Size ではなく、 である必要があります。char 配列のサイズでは、終端のヌル文字も考慮する必要があることに注意してください。

その後、ループに入ることができ、もう一度すべての文字と終端のヌル文字を処理します。何が何であるかがわからcounterず、それがヌル文字を含まない新しい文字列の長さであると仮定すると (したがって、+ 1 で計算されます)、ループに問題はないと思います。

于 2012-04-28T21:31:30.843 に答える
1

代入演算子のオーバーロードを開始する前に、C++ での演算子のオーバーロードを見てみましょう。オブジェクト指向プログラミングでは、オペレーターのオーバーロード (オペレーター アドホック ポリモーフィズムとしてあまり知られていない) は、ポリモーフィズムの特殊なケースであり、さまざまなオペレーターが引数に応じてさまざまな実装を持ちます。演算子のオーバーロードは、通常、言語、プログラマー、またはその両方によって定義されます。演算子のオーバーロードが使用されるのは、開発者がターゲット ドメインにより近い表記法を使用してプログラミングできるようにし、ユーザー定義型が言語に組み込まれた型と同様のレベルの構文サポートを可能にするためです。たとえば、科学計算では一般的であり、数学オブジェクトの計算表現を紙と同じ構文で操作できます。オブジェクトのオーバーロードは、関数呼び出しを使用してエミュレートできます。

代入演算子 (=) をオーバーロードする方法

この代入演算子のオーバーロードを行った後、自己定義データ型の 2 つの変数を代入できるようになります。以下の例を見てみましょう。

// Operator overloading in C++
//assignment operator overloading
#include<iostream>
using namespace std;

class Employee
{
private:
int idNum;
double salary;
public:
Employee ( ) {
    idNum = 0, salary = 0.0;
}

void setValues (int a, int b);
void operator= (Employee &emp );

};

void Employee::setValues ( int idN , int sal )
{

salary = sal; idNum = idN;

}

void Employee::operator = (Employee &emp)  // Assignment operator overloading function
{
salary = emp.salary;
}

int main ( )
{

Employee emp1;
emp1.setValues(10,33);
Employee emp2;
emp2 = emp1;        // emp2 is calling object using assignment operator

}

「=」演算子をオーバーロードするためのこのコードを説明しましょう。クラス「Employee」のパブリックメンバー関数である関数「setValues」を使用して、値を「idN」と「sal」に割り当てました。 「operator =」として定義されているオーバーロードされた関数。この関数内で、main() 関数で代入演算子を直接使用できるように、salary の値を同じクラスの他の変数に代入しました。main() でわかるように、Employee 型の 2 つの変数 emp1 と emp2 があり、コードの最後の行で代入演算子を直接使用できます。これはすべて、代入演算子のオーバーロードまたは演算子の演算子のオーバーロードが原因です “ = 」。

于 2013-09-27T16:57:26.137 に答える