0

オブジェクト指向プログラムでこのコピー コンストラクターを実行するのに助けが必要です。Hello World結果は、文字列 1:を文字列 2:にコピーする必要がありますThis is a test

私の.hファイルで:

void Copy(MyString& one);

私の.cppファイルで:

void MyString::Copy(MyString& one)
{
   one = String;
}

私のmain.cppファイルで:

String1.Print();
cout  << endl;
String2.Print();
cout  << endl;      
String2.Copy(String1);      
String1.Print();       
cout  << endl;
String2.Print();
cout  << endl;

出力:

Hello World
This is a test
is a test
This is a test

次のようになります

Hello World
This is a test
Hello World
Hello World

私が間違っていることを教えてください。

これが私の .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);
}

void MyString:: Set(int index, char b)

{

         if(String[index] == '\0')

          {
                   exit(0);
          }

         else

        {

                   String[index] = b;
          }


}

void MyString::Copy(MyString& one)

{

        one = String;


}

char MyString:: Get(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;


}
4

1 に答える 1

1

void Copy(MyString& one);はコピーコンストラクタではありませんが、必要なのはコピーを行う関数だけだと思います。

実装:

void MyString::Copy(MyString& one) {
   one = String;
}

これはString、おそらくクラスの内部ストレージを取得し、渡した文字列をそれに割り当てます...

つまり、それString2.Copy(String1)はを行うようなものString1 = String2.Stringです。目的の出力は、String1をString2にコピーしたいが、完全に間違った方向に進んでいることを示しています。

さらに、この割り当てが部分的なコピー(「テスト」)になるという事実は、どのようにその割り当てを行っても壊れていることを意味します。あなたはそれの実装を示さないので、私はそれがどのように壊れているかをあなたに言うことができません。


コードには多くの問題があります。あなたはおそらく他の学生やTAと一緒にそれを検討する必要があります。しかし、出力が示す特定の問題については、3つのことを確認する必要があります。最初のグーグル「三つのルール」。次に、左側がMyStringオブジェクトで右側がchar*の場合の「=」の意味を検討します。第3に、データがどの程度正確にコピーされるかを理解したら、割り当ての方向を逆にして(たとえば、*this = out.String)、正しい方向にコピーします。

于 2012-04-21T01:28:22.220 に答える