0

さて、私は演算子のオーバーロードに非常に慣れていないため、オブジェクト指向プログラムでこの関数を実行する必要がありますが、間違いなく助けが必要です. 手順は次のとおりです。

MyString オブジェクトには、文字列を出力する Print() メソッドが含まれている必要があります。

MyString オブジェクトには、文字列の長さを報告する Length() メソッドが含まれている必要があります

MyString オブジェクトには、初期文字列を「Hello World」の値に設定するデフォルトのコンストラクターが含まれている必要があります。

MyString オブジェクトには、文字列の初期値を設定できる代替コンストラクターが含まれている必要があります。

MyString オブジェクトは、次の演算子をオーバーロードする必要があります。

  • 前の割り当ての Set および Get 関数を置き換えるには、括弧演算子をオーバーロードする必要があります。文字列配列の境界に違反すると、両方のインスタンスが exit(1) を発行する必要があることに注意してください。

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

  • 2 つの文字列のサイズと内容が同一である場合に true を返す論理比較演算子 (==)。

  • 2 のブール否定を返す否定論理比較演算子 (!=)。

  • 2 つの文字列を連結する加算演算子 (+)

  • 加算/代入演算子 (+=) は次のように使用されます。 String1 += String2 として動作する String1 = String1 + String2

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

.cpp ファイルのコードは次のとおりです。

MyString::MyString()
{
       char temp[] = "Hello World";

       int counter(0);
        while(temp[counter] != '\0') {
              counter++;
       }
       Size = counter;
        String = new char [Size];
        for(int i=0; i < Size; i++)
            String[i] = temp[i];

}

MyString::MyString(char *message)

{
      int counter(0);
       while(message[counter] != '\0') {
            counter++;
        }
       Size = counter;
      String = new char [Size];
      for(int i=0; i < Size; i++)
             String[i] = message[i];
 }

 MyString::~MyString()
 {
      delete [] String;
 }

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

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

       return (counter);
  }

**const MyString operator +(const MyString& one, const MyString& two)
{
       MyString String1;
       return String1;
 }**



MyString& MyString::operator()(const int index, const char b)
{
       if(String[index] == '\0')
       {
               exit(1);
       }
       else
       {
         String[index] = b;
       }


 }

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

        Size = rhs.Size;
        counter = rhs.counter;

        delete [] String;
        String = new char[Size];


        for(int i = 0; i < counter+1 ; i++)
       {
               String[i] = rhs.String[i];
       }
       return *this;

 }

 bool MyString::operator==(const MyString& one)
 {
       if(one.Length() == two.Length())
       {
              for(int i = 0; i < one.Length()+1; i++)
              {
                      if(one[i] == two[i])
                            return true;
              }
       }
       else
             return false;
 }

 MyString& MyString::operator()(const int i)
 {

        if( String[i] == '\0')
        {
              exit(1);
        }
        else
       {

            return String[i];

       }
 }

void MyString::Print()
{
       for(int i=0; i < Size; i++)
               cout << String[i];
       cout << endl;

}

メインファイルのコードは次のとおりです。

int main (int argc, char **argv)
{

 MyString String1;             //Test of default constructor. Use "Hello world"
 MyString String2 ("Two strings are not equal");       //Test of alternate constructor
 MyString String3 ("Two strings are equal");
 MyString String4 (String1);

 cout << "*************Test of values*************" << endl;
 String1.Print ();
 String2.Print ();
 String3.Print ();

 cout << "*************Test of Length*************" << endl;
 cout << String1.Length () << " ";
 cout << String2.Length () << " ";
 cout << String3.Length () << endl;

 cout << "*************Test of Set*************" << endl;
 String1 (0, 'J');
 String1.Print ();

 cout << "*************Test of Copy*************" << endl;
 String1.Print ();
 cout << endl;
 String3.Print ();
 cout << endl;
 String3.Copy (String1);       //String1 should be copied into String3
 String1.Print ();
 cout << endl;
 String3.Print ();
 cout << endl;

 cout << "*************Test of Get*************" << endl;
 for (int i = 0; i < String1.Length (); i++)   //The last character should exit the    program
   {
      cout << String1 (i) << " ";
   }
  }
   cout << endl;

   if (String1 == String4)
   {
      String3.Print ();
   }
   else
   {
     String4.Print ();
   }

   if (String1 != String4)
   {
      String3.Print ();
   }
   else
   {
      String4.Print ();
    }

   String1 = String2 = String3;
   String1.Print ();
   String2.Print ();
   String3.Print ();


   String1 = String2 + String3 + String4;
   String1.Print ();

   String2 += String3;
   String2.Print ();

   return 0;

 }

main.cpp ファイルは変更できませんが、他の .cpp ファイルはそのファイルと共にコンパイルおよび実行する必要があります。

4

1 に答える 1

7

演算子の宣言をヘッダーに入れる必要がありますが、問題はoperator+for your string の中でoperator+for your string を使用していることです

const MyString operator +(const MyString& one, const MyString& two) {
        MyString String1 = one + two; // this calls operator+, which calls operator+, which calls...
        return String1;
}

また、MyStringby 値を返しているため、 by を返すべきではありませんconst:

MyString operator +(const MyString& one, const MyString& two) {
        MyString String1;
        // do something with the data of one and two and put it in String1
        return String1;
}

最後に、オペレータが の非公開データにアクセスする必要がある場合は、それをクラスMyStringのフレンドとして宣言する必要がありますMyString

class MyString {

// as before

friend MyString operator+(const Mytring& rhs, const MyString& lhs);

};
于 2012-04-28T15:43:48.337 に答える