2016-12-03 14 views
2

状況:私が思うに、これは動作するかどうC++のゲッターとセッターの代わりに "プロパティ"のようなメソッド?

class Person { 
public: 
    int& age(); 
    int age() const; 
private: 
    int m_age; 
}; 

私は、知りませんが、そう私の最初の質問はこれです:これらの方法では

  • 、私は C#のような「プロパティ」を作成することができます?私は意味:私は何かがm_ageの値を変更したときにどうするかを実装することができます最初方法で
    • がm_ageの値を使用しているときに何が起こるべきかを実装することができるのは、の第2のです。

例:私は、これは演算子のオーバーロードとconstの混合方法に基づいている愚かさに満ちていることを考え始めています

Person p; 
p.age() = 15; //first method is called? 
std::cout << p.age(); //second method? 

、そうしてください:誰かが私を啓発するだろうか? :D

これが奇跡的にうまくいく場合、ゲッター&の代わりにこれを使うことができますか?これは悪い練習ですか?

+0

セッターはどのようにパラメータなしで動作しますか? –

+1

@Eli setterがm_ageを参照して返すと思います。 –

+0

返された参照を使用します。または、メソッドがインラインである場合、これは唯一の動作ですか? @TonyJはい – Tudvari

答えて

2

ようはいとセッター異なるそのメンバ変数へのクライアントの完全な制御を与えます。

プロパティは、隠蔽関数の構文糖です。あ、はい。参照を返す関数を記述して、表面にプロパティのようなものを得ることができます。

これを考慮してください:プロパティの背後には、単純に値を設定する以外のことを行うことができるセッター関数があります。セッターのポイントは、値を設定してもオブジェクトの状態が損なわれないようにすることです。

セッターに、privateメンバーへの保護されていない参照を返す関数を置き換えることで、この防衛線を取り除くことになります。呼び出し元は、参照が適切であると見なされ、オブジェクトの可能性のある損害に使用されます。これは会員の性質によっては上手くいくかもしれませんが、正直であるかもしれません。メンバーpublicを宣言し、読みやすさを向上させ、関数の書き換えの手間を省きます。質問のconst一部については

は、あなたは一種のint age(const person * this) OPの例では

age()としてint& age(Person * this)としてint& age()int age() constを考える(これは「一種の」の醜い、単純なソートである)ことができます定数Personで決して呼び出されないので、int age() constが呼び出される理由はありません。

3

あなたのコードがうまくコンパイルし、意図したとおりに動作します:

#include <iostream> 

class Person { 
public: 
    int& age() { return m_age; } 
    int age() const { return m_age; } 
private: 
    int m_age; 
}; 

int main() { 
    Person p; 
    p.age() = 15; //first method is called? 
    std::cout << p.age(); //second method? 
} 

See Live Demo


奇跡的にこれが動作する場合、私はこの代わりにゲッター&セッターまたはこれはを使用することができます悪い運動? (強調鉱山)

いいえ、これはセッター関数の実際の代替品として使用することができません。メンバ変数への参照を返す
はない

void age(int newValue) { 
    if(newValue > 150) { 
     throw std::invalid_argument("You're older than 150? We don't believe that!"); 
    } 
    m_age = newValue; 
}; 
+0

ハ! 8秒で私を打つ。私に校正を教えてください。少し違いますが、私は自分の答えを生き続けます。 – user4581301

+0

@ user4581301私は散文よりもコードで考えているかもしれません:P –

+0

1つ以上の回答を受け入れることができれば、私は両方を受け入れますが、散文はより詳細なので、受け入れました。申し訳ありませんが、助けてくれてありがとう! :) – Tudvari

関連する問題