2017-11-30 16 views
-2

私はC++でC#スタイルの文字列の実装を試しています。 オブジェクトとクラスStringのポインタを作成し、そのオブジェクトをポインタに割り当てました。私は、既存のオブジェクトを変更するのではなく、ポインタを介してオブジェクトを修正しようとすると、私は新しいオブジェクトを作成し、ポインタがそれを指し示すようにしたい。C#でのC#スタイル文字列の実装

私は "="演算子をオーバーロードし、演算子オーバーロードされたメソッドで新しいオブジェクトを作成しました。変更を反映するために私は使用する必要がありますss=*ss = "name";

このコードを改善するための提案。以下は

私のサンプルコードでは、私はまた、このポインタを変更しようとしましたが、予想通り

String *ptr; 
ptr = const_cast<String*>(this); 
ptr = new String(s); 
+0

これは何らかの運動ですか? 'std :: string'はあなたのケースでは使えませんか? – Oneiros

+0

はい、その単なる運動です。 –

+0

'ss = * ss =" name ";'はコンパイルされません。 –

答えて

1

を働いていない私は、このようないくつかの変更をお勧めします

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()では、元のポストで要求してから(メモリリークを防ぐために後で削除される)ポインタを指すポインターの新しいオブジェクトも作成しました。

これらの変更に関するご質問がある場合はお知らせください。

+1

operator =では、temp変数に新しい&strcopyを追加し、strを削除して置き換えることをお勧めします。このように、newが例外をスローすると、オブジェクトは変更されません。 – burlyearly

+1

良い点。私はちょうどそれを編集しました。あなたがそれが良いと思うかどうか私に教えてください。 –

+0

もっとよく見えます。 muh原コメントに対するアップヴォートは感謝します。どうも! – burlyearly