我用“abc”分配一个,用“def”分配b,将它们加在一起并进行更改。我想要留下来作为abc。而是它的“abcdef”。 C是应该是“abcdef”的唯一值。我在这里做错了什么?
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
class String {
public:
void print();
String operator=(const String& Other)
{
message = Other.message;
return *this;
}
String operator+(const String& Other)const
{
return String(strcat(message, Other.message));
}
String operator+=(const String& Other)
{
}
String(char* def = "Default")
{
message = new char[strlen(def) + 1];
strcpy(message, doub);
}
String(const String &obj)
{
message = obj.message;
}
~String();
private:
char * message;
};
void String::print()
{
cout << message;
}
String::~String(void) {
cout << "Object is being deleted" << endl;
}
// Main function for the program
int main() {
String a("abc");
String b("def");
String c;
c = a + b;
_getch();
return 0;
}
答案 0 :(得分:1)
您正在使用strcat
,它基本上会将Other.message
附加到您的message
内存块。您可以在here
要解决您的问题,您可以制作以下内容:
return String(strcat(strcat(str.message, this->message), Other.message))
答案 1 :(得分:1)
“abc”和“def”是C字符串只读文字,它们以只读部分存储在可执行文件中,稍后映射到只读存储器。
当您使用strcat
时,您正在调用未定义的行为,因为您正在尝试修改“abc”值。
这里正确的方法是在构造函数中分配内存,并将参数的strcpy值分配给内部分配的指针。然后 - 在operator +中你将重新分配这样的指针以允许更多的内存。
答案 2 :(得分:0)
您有类多个问题,其中大部分问题源于您使用指针message
。
有一件事是,例如,operator+
函数使用指针调用strcat
,而不重新分配它指向的内存,因此它将适合旧的和 new字符串。
你真的无法重新分配指针,因为你并不真正拥有指针所指向的数据。突出示例:您赋值运算符复制指针而不是它指向的字符串。这意味着你将有两个String
个对象都指向同一个内存。
您也没有析构函数,因此您创建的每个String
对象都会导致内存泄漏。但是,只是添加一个删除内存的析构函数是不够的,除非你修复指针复制。