2012-01-09 14 views
4

C++で正しくプロパティを作成する方法が不思議です。 Objective Cでは、 "@property"(一般的に(非原子、保持)属性を使用します)。Objective C "@property(nonatomic、retain)"のC++に相当するものは何ですか?

C++での適切な方法は何ですか?

ありがとうございます!

+3

C++のプロパティのファーストクラスの概念はありません。その影響に対するベンダー固有の拡張もありますが、Macの世界ではそうではありません(IIRC)。 –

答えて

3

Sevaが述べたように、C++ではそのような意味でのプロパティはありません。あなたができること:boost::share_ptrメンバ変数を持つクラスを作成し、オプションでそのメンバのgetterとsetterを記述します。しかし、それは本当に必要なことではないかもしれませんが、おそらく良い行動とみなされます。

typedef boost::shared_ptr<std::string> StringPtrT; 

class A { 
public: 
    void setStringProperty(StringPtrT s) { this->string_property = s; } 
    StringPtrT getStringProperty() const { return this->string_property; } 

protected: 
    StringPtrT string_property; 
} 

共有ポインタは共有と参照カウントを扱い、基本的には「保持」動作の一部をシミュレートします。 IIRCのboost shared_ptr型は、参照カウントの更新に関しては常にアトミックです。ただし、オブジェクト自体へのアクセス(ポインタの逆参照)は非アトミックになります。必要に応じて、あなた自身で対処しなければなりません。

1

@ Ameのコードは正しいですが、特にここにshared_ptrを使用する必要はありません。私は広くshared_ptrの使用について非常に裂かれています。それは便利なことがありますが、私の経験には微妙な複雑さがたくさんあります。従来のC++のアプローチではありません。 C++では、所有権を共有するのではなく、オブジェクト所有権を強く使用することがよくあります(これはObjCの共通モデルです)。 shared_ptrを使用している場合は、Cocoaプラットフォーム用に組み込まれているので、ブーストする必要はありません。 shared_ptrの複雑さの感覚を得るには、Wrapping C++ – Take 2, Part 2と読むことができます(少し日付が入り、一部はARCコードには適用されません)。

つまり、@ Ameのアプローチは本質的に正しいと言います。しかし、通常は、shared_ptrではなく単純なプロパティのコピーを使用します。 (これは特に文字列の場合にも当てはまりますが、ほとんどのObjCコードでも同様です)。スタイルガイドをお探しの方は、通常Google'sをお勧めします。それは完璧ではありませんが、それは非常によく考えられています。あなた自身を発明する前に、少なくとも多くの人々にとってはうってつけのものから始めることは良いことです。 (EDITは:反対意見については、以下の@Matthieu M.さんのコメントを参照してください。)

class MyClass { 
public: 
    ... 
    int num_entries() const { return num_entries_; } 
    void set_num_entries(int num_entries) { num_entries_ = num_entries; } 

private: 
    int num_entries_; 
}; 

private:はここに正しいです。私は@ Ameのprotected:の使用に同意しない。 ObjCのように、クラスの内部でもアクセサーを使用する必要があります。間違いなくサブクラスでアクセサーを使用する必要があります。サブクラスがivarsに直接アクセスできるようにすることは脆弱です。サブクラスはスーパークラスの特別な知識が必要です。

文字列プロパティとその他の単純または不変オブジェクトの場合は、一般にshared_ptrのようなコピーコンストラクタを使用する必要があります。より複雑で変更可能なオブジェクトの場合、C++は通常、共有所有権よりも強力なオブジェクト所有権を奨励します。ですから、(一般的に)他の複雑なオブジェクトを作成、管理、破壊する責任があるオブジェクトがあるはずです。誰もがオブジェクトの所有者から参照を取得するだけです。オブジェクトを作成したり破棄したりしてはいけません。

これは共有されていないか、厳密な所有権がIMOの方が優れています。共有された所有権はObjCの方法であり、すべてのコードはそのように機能します(それは非常にエレガントです)。厳密な所有権はC++の方が多く(C++が「ある意味で」あると言えるほど)、共有所有権を借りようとすることはしばしば脆弱です。

+3

私は、Googleのスタイルガイドが非常によく検討されており、良いスタートであるという主張に強く同意します。 Googleのスタイルガイドは、CとC++のコードベースが混在しているユーザーを対象としています(例:例外が禁止されています)。純粋なC++コードベースでは、使用すべきではありません。初心者は、Googleのスタイルガイドに触れる前に、他のリソース(優秀な本のためのC++タグを参照してください、GotWサイトを読んでください...)を使用するよう奨励されなければなりません。 –

+0

@MatthieuMに延期します。ここでは純粋なC++プロジェクトです。私は主に、CとC++のコードが混在していることが多いObjCの開発者です。彼が指摘しているように、Googleのスタイルはそのようなケースに合わせて設計されているため、私にとっては完全ではないにしても合理的にうまく機能しています。 –

関連する問題