を働いていない私は、このようないくつかの変更をお勧めします
class String
{
char *str;
public:
String(char* str_in)
{
str = new char[strlen(str_in)];
strcpy(str, str_in);
}
String* operator=(char* s)
{
return new String(s);
}
};
int main()
{
String s="sample";
String *ss;
ss = &s;
ss=*ss = "name";
return 0;
}
です:
#include <string.h>
class String
{
char *str;
public:
String(const char* str_in)
{
str = new char[strlen(str_in)];
strcpy(str, str_in);
}
~String()
{
delete [] str;
}
String& operator=(const char* s)
{
char* tmp = new char[strlen(s)];
strcpy(tmp, s);
delete [] str;
str = tmp;
return *this;
}
};
int main()
{
String s("sample");
String *ss;
ss = &s;
ss = new String("name");
delete ss;
return 0;
}
を
まず、適切なデストラクタが必要です。そうしないと、文字列g ets破壊されました。 char *を削除すると、これが修正されます(配列であるため、配列deleteを使用します)。
第2に、C++では、ほとんど常にoperator =(ポインタではない)の参照を返します。したがって、この改訂された演算子=関数はおそらく良いでしょう - 古い文字列を削除し、新しい文字列にメモリを割り当て、新しい文字列をコピーして*これを返します。
第3に、コンストラクタと代入演算子を編集していないので、char *の代わりにconst char *を使用できます。
main()では、元のポストで要求してから(メモリリークを防ぐために後で削除される)ポインタを指すポインターの新しいオブジェクトも作成しました。
これらの変更に関するご質問がある場合はお知らせください。
これは何らかの運動ですか? 'std :: string'はあなたのケースでは使えませんか? – Oneiros
はい、その単なる運動です。 –
'ss = * ss =" name ";'はコンパイルされません。 –