我现在快要放弃了 - 头痛和红眼睛。你们中的一些人可能会对这个问题进行投票,但我别无选择。我不是懒惰但没有人可以交谈。
所有关于在c ++中创建自己的String-class,其中一个可以连接字符串,将另一个字符串对象发送到字符串构造函数,或者将字符串文字发送到构造函数。
该程序应该输出以下内容:
hello hello2
much hedache!!!
Enter a name:
hello John
相反,该计划正在产生以下内容:
hello hello2
much hedache!!!
Enter a name:
much headache John
对于某些原因,字符串“很头疼”保留在对象中 - 不能用字符串和字符串3的串联替换。
string2 = "much hedache!!!";
我注意到,当我将一个字符串对象发送给构造函数时,这会以某种方式引起。
String string2(string);
如果我现在将其更改为以下内容:
String string2("hello2");
它有效。
我无法弄清楚为什么,非常高兴有人可以回答这个问题。
#include <iostream>
using namespace std;
class String {
public:
char *string;
String(char *ch) {
string = new char[strlen(ch)];
int i = 0;
for(char *temp_ch_ptr = ch; *temp_ch_ptr; ++temp_ch_ptr) {
string[i] = *temp_ch_ptr;
i++;
}
}
String() {
string = new char[100];
}
String (String &string_obj) {
string = new char[strlen(string_obj.string)];
string = string_obj.string;
}
String operator=(char *ch) {
strcpy(string, ch);
return *this;
}
String operator+(String obj) {
String temp;
strcpy(temp.string, string);
strcat(temp.string, obj.string);
return temp;
}
};
ostream &operator<<(ostream &stream, String obj) {
stream << obj.string;
return stream;
}
istream &operator>>(istream &stream, String obj) {
cout << "Enter a name: ";
stream >> obj.string;
return stream;
}
int main() {
String string("hello ");
//String string2("hello2 ");
String string2(string);
cout << string << string2 << endl;
string2 = "much hedache!!!";
cout << string2 << endl;
String string3;
cin >> string3;
string2 = string + string3;
cout << string2 << endl;
return 0;
}
我不确定复制构造函数 - 可能存在问题吗?
答案 0 :(得分:2)
我不确定复制构造函数 - 可能存在问题吗?
是的,绝对的。它根本不起作用。
string = new char[strlen(string_obj.string)];
在这里,您可以创建一个与现有字符串长度相同的新数组。
string = string_obj.string;
在这里你完全扔掉那个新数组(让它悬空作为内存泄漏),然后将新的字符串对象的指针设置为与旧字符串对象的指针相同。
您需要执行深层复制;我建议std::copy
。
此复制构造函数也应该const String&
,而不是String&
;同样,如果您希望传递字符串文字有效,则char*
构造函数应该实际使用const char*
。
答案 1 :(得分:1)
您的程序既有错误又有内存泄漏。在复制构造函数中,您分配内存但是新用,而只是指向传递的字符串的内存。您应该将传递的字符串的内容复制到新分配的内存中。结果,分配的内存丢失。你也没有提供任何析构函数来解除分配内存。
String (String &string_obj) {
string = new char[strlen(string_obj.string)];
strcpy(string,string_obj.string);
}
~String(){delete string;}