我需要帮助在面向对象的程序中执行此复制构造函数。结果应该是将字符串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;
}
答案 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
),这样你就可以朝正确的方向进行复制。