实现自己的String类,operator+出现问题

来源:互联网  时间:2017/10/27 12:26:54

关于网友提出的“ 实现自己的String类,operator+出现问题”问题疑问,本网通过在网上对“ 实现自己的String类,operator+出现问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 实现自己的String类,operator+出现问题
描述:

c++stringoperator+

实现一个自己的String类,可是实现operator+有问题,具体代码如下:

#include 
#include 
using namespace std;
class MyString
{
private:
int len;
char* buffer;
public:
MyString() :len(1), buffer(new char[1])
{
buffer[0] = '\0';
}
MyString(const MyString&);
MyString(const char*);
MyString& operator=(const MyString&);
MyString& operator=(const char*);
MyString& operator=(MyString&&);
~MyString();
int size() const;
char* data() const;
MyString& operator+=(const MyString&);
friend MyString operator+(const MyString&, const MyString&);
operator char*();
};
MyString::MyString(const MyString& str)
{
cout << "copy constructor" << endl;
len = str.size() + 1;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, str.data());
}
MyString::MyString(const char* chStr)
{
int i = 0;
while (chStr[i++] != 0);
len = i;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, chStr);
}
MyString& MyString::operator=(const MyString& str)
{
len = str.size() + 1;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, str.data());
return *this;
}
MyString& MyString::operator=(MyString&& str)
{
len = str.size() + 1;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, str.data());
str.len = 1;
if (buffer != NULL)
delete[] str.buffer;
str.buffer = new char[1];
str.buffer[0] = '\0';
return *this;
}
MyString& MyString::operator=(const char* chStr)
{
int i = 0;
while (chStr[i++] != 0);
len = i;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, chStr);
return *this;
}
MyString::~MyString()
{
if (buffer != NULL)
delete[] buffer;
cout << "destructor" << endl;
}
int MyString::size() const
{
return len - 1;
}
char* MyString::data() const
{
return buffer;
}
MyString::operator char*()
{
cout << "operator char*" << endl;
return buffer;
}
MyString operator+(const MyString& str1, const MyString& str2)
{
cout << "operator + begin" << endl;
int n1, n2;
char * S;
n1 = strlen(str1.buffer);
n2 = strlen(str2.buffer);
S = new char[n2 + n1 + 1];
strcpy(S, str1.buffer);
strcat(S, str2.buffer);
MyString S1(S);
cout << S1 << endl;
cout << "operator + end" << endl;
return S1;
}
int main()
{
MyString s1("123");
MyString s2 = "456";
cout << s1+s2 << endl;
return 0;
}

运行结果如下:
 实现自己的String类,operator+出现问题
根据运行结果,operator+中在return之前应该都是没有问题的,应该是return结果复制到临时变量时出了问题,可是这里面到底是怎么实现的不太懂,望大牛们多多指导,是哪个地方写的有问题,谢谢!
解决方案1:


几个构造函数里
     MyString(const MyString&);
    MyString(const char*);
因为他是构造函数,代表它在对象初始化时候调用,也就是说对象是从无到有的情况下,而那个时候的buffer值,是不需要delete的,而且由于编译器对于指针类型的字段有可能赋予随机值,而不是NULL,所以delete出错。

解决方案2:

去掉构造函数里面的
if (buffer != NULL)
        delete[] buffer;

解决方案3:

拷贝构造和赋值函数没有进行自我检查,要检查参数的str地址和this指针是否一致。
既然实现了赋值的移动语义,构造也要。
赋值的移动语义函数实现不正确,移动,就应该直接把缓冲区拿过来,同时把参数的缓冲区设置null,而不是new了再strcpy

解决方案4:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
《C++编程思想》

上一篇main函数最后一行报Segmentation fault: 11,什么原因?
下一篇如何把一句话分解成单词存放到字符串数组中??
明星图片
相关文章
《 实现自己的String类,operator+出现问题》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)