使用.Copy执行复制构造函数的最佳方法?

时间:2012-04-21 01:18:00

标签: c++ string object copy-constructor

我需要帮助在面向对象的程序中执行此复制构造函数。结果应该是将字符串1:Hello World复制到字符串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;


}

1 个答案:

答案 0 :(得分:1)

void Copy(MyString& one);不是复制构造函数,但我想你需要的只是一个复制函数。

实施:

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

这是String,无论是什么,大概是你的类内部存储,并为它分配你传入的字符串......

这意味着String2.Copy(String1)就像在做String1 = String2.String一样。您想要的输出表明您想将String1复制到String2中,但是你的方向完全错误。

此外,这个赋值导致部分拷贝(“是一个测试”)的事实意味着你做的那个任务也会被打破。你没有显示它的实现,所以我不能告诉你它是如何被破坏的。


代码存在许多问题。您可能应该与其他学生或TA一起讨论。但是对于输出显示的具体问题,您应该看看三件事。首先谷歌'三个规则'。其次考虑当左侧是MyString对象而右侧是char *时,'='表示什么。第三,一旦你弄清楚数据的确切复制方式,就可以反转分配的方向(例如*this = out.String),这样你就可以朝正确的方向进行复制。