2017-03-04 21 views
0

私は割り当てをしているので、私のクラスのフィールドとしてCスタイルの文字列を使用する必要があります。私はそれのための安全なゲッターを作成しようとしているが、私はそれを行う方法がわからない。使用 フィールドイム:char []フィールドのゲッターを作成する安全な方法

char name[20]; 

は、これまでのところ私はこれらの事を試してみました:

char* Car::getName() { 
    return &name[0]; 
} 

^動作しますが、イム右のそれを編集することができますフィールドのアドレスを返す場合にのみ1を。

char* Car::getName() { 
    char ret[20]; 
    strcpy(ret, name); 
    return ret; 
} 

^ノー成功

と試みた別のアプローチだから私は、このようなゲッターを作成するための適切な方法何お尋ねしたいのですが? (純粋な質問が残念ですが、私は人生でCをたくさん使っていません)

+0

これは私が知っているCではありません –

+0

削除されたCタグです。これは明らかにC++です。 – ShadowRanger

+0

はい、申し訳ありません – gryfon1997

答えて

2

戻り値の型をconst char *と宣言し、関数自体をconstにします(呼び出しによってオブジェクトが変更されていないことを示します) 。呼び出し側はキャストを介して無視することができますが、それはそれらの上にあります。これは正確さのためであり、セキュリティのためではありません。

const char* Car::getName() const { 
    return &name[0]; 
} 

これらのクラスには内部クラスへのポインタがありますが、前記ポインタが読み取り専用データであることが明示されています。

その他のオプションは、(戻り値の型std::stringreturn std::string(name);)あなたはオンデマンドで構築することstd::stringとして公開、または動的に(std::stringを返すことに道徳的に相当)のメモリを割り当てられるためにいくつかの種類のスマートポインタを返すあります。ダンプポインタ(たとえばreturn strdup(name);)をコピーして返すことは悪い考えです。今度はメモリリークの扉を開いたためです。呼び出し元は手動でfree/deleteのメモリを持っていなければなりません。

+2

関数名とパラメータリストの後に "const"を追加することをお勧めします:const char * Car :: getName()const {}。これは、クラスオブジェクトが関数によって変更されないことを意味します。これは、不変性をさらに保証します。 – Michael

+1

@マイケル:良い点。追加するように編集しました。 – ShadowRanger

+0

代わりにバッファに長さを加えたものを渡すこともできます。 void getName(char * name、int max)クラスが範囲外になると、const *は消えません。 –

関連する問題