带连接的字符串 class с++
String class with concatenation с++
我最近开始学习 C++,但在使用字符串连接实现我自己的字符串 class 时遇到了问题。
当字符串相加时,调试时出现错误:
我检查了很多行,发现程序在行很短时工作正常,但在行很长时就完全停止工作了
我想我在某处搞砸了我的记忆,但我找不到哪里
我会很高兴得到任何帮助
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class String
{
private:
char *data;
int length;
public:
~String();
String(){};
String(char*);
int get_length(){return length;}
void add_stick();
String operator+(const String &);
void show();
friend istream &operator>>(istream &, String &);
friend ostream &operator<<(ostream &, const String &);
};
void String::add_stick()
{
for (int i = 1; i <= length; i++)
{
if (i % 2 == 0)
{
data[i-1] = '_';
}
}
}
String::String(char* str)
{
length = strlen(str);
data = str;
}
void String::show()
{
cout << data;
}
String String::operator+(const String &str)
{
char* tmp;
int len = length + str.length;
tmp = new char (len);
for (int i = 0; i < this->length; i++)
{
tmp[i] = this->data[i];
}
int j = 0;
for (int i = this->length; i < len; i++)
{
tmp[i] = str.data[j];
j++;
}
String koko(tmp);
tmp = nullptr;
delete[] tmp;
return koko;
}
String::~String()
{
data = nullptr;
delete[] data;
length = 0;
}
istream &operator>>(istream &in, String &str)
{
str.data = new char[1000];
in.getline(str.data, 1000);
str.length = strlen(str.data);
return in;
}
ostream &operator<<(ostream &out, const String &str)
{
out << str.data;
return out;
}
int main()
{
String s[5];
cin >> s[0] >> s[1] >> s[2] >> s[3] >> s[4];
String str (s[0] + s[1] + s[2] + s[3] + s[4]);
str.add_stick();
cout << str;
}
你的代码有很多问题。
- 你的
operator=
在哪里?您似乎违反了 Rule of Three。这是一个巨大的内存错误。
for (int i = 1; i <= length; i++) if (i % 2 == 0)
似乎是一种奇怪的写法 for (int i = 2; i <= length; i+=2)
。这工作正常,只是很奇怪。
operator+
没有为空终止符分配足够的字节,因此之后的所有操作都将读取缓冲区末尾。这是一个巨大的内存错误。
String(char* str)
不复制数据,它假定传入的指针的所有权。可能 有效,除了 operator+
从tmp
构造一个String
,然后删除tmp
,所以现在String
的数据没有了。这是一个巨大的内存错误。
我最近开始学习 C++,但在使用字符串连接实现我自己的字符串 class 时遇到了问题。
当字符串相加时,调试时出现错误:
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class String
{
private:
char *data;
int length;
public:
~String();
String(){};
String(char*);
int get_length(){return length;}
void add_stick();
String operator+(const String &);
void show();
friend istream &operator>>(istream &, String &);
friend ostream &operator<<(ostream &, const String &);
};
void String::add_stick()
{
for (int i = 1; i <= length; i++)
{
if (i % 2 == 0)
{
data[i-1] = '_';
}
}
}
String::String(char* str)
{
length = strlen(str);
data = str;
}
void String::show()
{
cout << data;
}
String String::operator+(const String &str)
{
char* tmp;
int len = length + str.length;
tmp = new char (len);
for (int i = 0; i < this->length; i++)
{
tmp[i] = this->data[i];
}
int j = 0;
for (int i = this->length; i < len; i++)
{
tmp[i] = str.data[j];
j++;
}
String koko(tmp);
tmp = nullptr;
delete[] tmp;
return koko;
}
String::~String()
{
data = nullptr;
delete[] data;
length = 0;
}
istream &operator>>(istream &in, String &str)
{
str.data = new char[1000];
in.getline(str.data, 1000);
str.length = strlen(str.data);
return in;
}
ostream &operator<<(ostream &out, const String &str)
{
out << str.data;
return out;
}
int main()
{
String s[5];
cin >> s[0] >> s[1] >> s[2] >> s[3] >> s[4];
String str (s[0] + s[1] + s[2] + s[3] + s[4]);
str.add_stick();
cout << str;
}
你的代码有很多问题。
- 你的
operator=
在哪里?您似乎违反了 Rule of Three。这是一个巨大的内存错误。 for (int i = 1; i <= length; i++) if (i % 2 == 0)
似乎是一种奇怪的写法for (int i = 2; i <= length; i+=2)
。这工作正常,只是很奇怪。operator+
没有为空终止符分配足够的字节,因此之后的所有操作都将读取缓冲区末尾。这是一个巨大的内存错误。String(char* str)
不复制数据,它假定传入的指针的所有权。可能 有效,除了operator+
从tmp
构造一个String
,然后删除tmp
,所以现在String
的数据没有了。这是一个巨大的内存错误。