2

次に例を示します。

circle.h 内

class circle
{
    double _radius;
public:
    double getRadius() {return _radius;}
    void setRadius(double r) {_radius=r;} 
}

主に

int main()
{
    circle a;
    cout<<a.getRadius();    // I want to use "a.radius"
    a.setRadius(3.2);       // I want to use "a.radius=3.2"
}

最初の質問は、インスタンス変数に直接アクセスするのではなく、get 関数と set 関数を使用してインスタンス変数にアクセスする必要がある理由です。2 番目の質問は、(objective-c が行ったように) get と set の関数呼び出しが簡潔に見えるようにするために、演算子のオーバーロードを行う方法です。

4

5 に答える 5

5

もちろん、希望する構文を利用できるようにする最も簡単な方法は、次のよう_radiusに public メンバーを作成することradiusです。

class circle
{
public:
    double radius;
}

これで、次のように使用できます。

circle c;
c.radius = 10.0;

ただし、コードの記述方法 (または C# での記述方法) のみに基づいてそのような決定を下すべきではありません。すべてのメンバーについて、次の点について検討することをお勧めします。

  1. メンバーを直接設定するのは理にかなっていますか? おそらく、メンバーはオブジェクトの状態のプライベートな部分であり、他のメンバー関数の影響を受けます。次の例を考えてみましょう。実際に公開したいインターフェースは、 のサイズを増やす単なる関数ですcircle

    class circle
    {
    public:
        circle(double radius, double delta = 1.0)
          : radius(radius), delta(delta) { }
    
        double increaseSize() {
          radius += delta;
          return radius;
        }
    private:
        double radius;
        double delta;
    }
    
  2. 不変条件を適用する必要がありますか? おそらく、circle負の半径を持つ a は存在しないと判断したとします。指定された新しい半径をチェックして 0 より大きいことを確認するメンバー関数を使用して、これを強制することができます。

  3. インターフェイスを介してメンバーの別の表現を提供しますか? メンバーとして半径を維持したいcircle場合もありますが、クライアントが知りたいのはそのエリアだけです。radius非公開にしてから、次のgetAreaような関数を提供できます。

    class circle
    {
    public:
        circle(double radius)
          : radius(radius) { }
    
        double getArea() {
          return PI * radius * radius;
        }
    private:
        double radius;
    }
    
  4. 現時点では上記の点のいずれにも当てはまらない可能性がありますが、将来的には当てはまる可能性があります。この先見の明がある場合は、getter 関数と setter 関数を今すぐ提供することをお勧めします。これにより、クライアントが使用するインターフェイスが後で変更されなくなります。

getter と setter の別の命名スキームとして、2 つのオーバーロードされた関数 (1 つは設定用、もう 1 つは取得用) を単純に持つことは非常に一般的です。

class circle
{
public:
    void radius(double); // Set the radius
    double radius();     // Get the radius
private:
    double radius;
}
于 2013-04-09T13:05:27.803 に答える
2

最初の質問への回答: オブジェクトがカプセル化され、変更された内部表現や、半径が変更されたときに変更/更新する必要性に対処できます。

2番目に:できません。C++ は、そのようなオブジェクトのゲッターとセッターをサポートしていません。

(実際にはほぼ可能ですが、実際には価値がありません)

于 2013-04-09T12:54:56.053 に答える
0

ゲッターとセッターを使用して、カプセル化を改善し、基になる実装を簡単に変更できるようにします。

2番目の質問について:それはできません。getter メソッドと setter メソッドを作成する必要があります。

于 2013-04-09T12:56:03.483 に答える