私は長さを表すint
とデータのためにchar*
で構造化された文字列クラスに取り組んでいます。C++での自己連結
String s1 = "Hello";
s1 += s1;
cout << s1;
これが返されます:À$p
またはその他の奇妙な文字私は、あなたが、たとえば、自己連結するにはしようとしたときを除いて、うまく動作します+=
演算子をオーバーライドしています。関連コードは次のとおりです。
#include <iostream>
#include <cstring>
#include "assert.h"
using namespace std;
class String{
public:
int len;
char *str;
String()
:len(0), str(nullptr){}
String(char const* S)
:len(strlen(S)), str(new char[len +1]){
assert(S != 0);
strcpy(str, S);
}
~String(){
delete[]str;
}
char* data() const{
return this->str;
}
String operator +=(String const &S){
int n = this->len + S.len;
char * p = new char[n+1];
strcpy(p + len, S.str);
len = n;
str = p;
return *this;
}
};
std::ostream& operator <<(ostream& os, String const& str){
return os << str.data();
}
int main()
{
String g1 = "Hello";
g1 += g1;
cout << g1;
return 0;
}
だけ通知を:あなたのコードは、メモリリークが発生します。 –
また、現在のバッファの内容を新しいバッファにコピーしませんでした。 – LogicStuff
あなたは、 '+ ='のオーバーロードに取り組む前にコードを本当に単体テストするべきです。この単純な 'main'関数は' int main(){String s1( "abc");}という問題があることを示しています。 String s2 = s1;} ' – PaulMcKenzie