0

私は現在、ピアソン印刷会社の著書「Starting Out With C++EarlyObjects」の第7章に取り組んでいます。

このクラス宣言の変数「r」の関数を理解できません。

class Circle
{  private:
       double radius;

   public:
       void setRadius(double r)
       {  radius = r; }

  double getArea()
      {  return 3.14 * pow(radius, 2); }
};

なぜこのように「radius」変数を書くことができないのですか?

class Circle
{  private:
       double radius;

  double getArea()
      {  return 3.14 * pow(radius, 2); }
};

の機能がわかりません

   public:
       void setRadius(double r)
       {  radius = r; }

声明。

4

4 に答える 4

1

技術的な理由は、「radius はプライベートであるため、クラス外からはアクセスできない」ためです。したがって、radius への変更は、 のようなパブリック メンバー関数によって何らかの方法で管理される必要がありますSetRadius

「なぜデザイナーはそのようにして、公開しなかったradiusのか?」という疑問が生じた場合、これは、適切なオブジェクト指向設計とは、何を公開し、何を公開する必要があるかについて、終わりのない議論です。オブジェクトの内部ではありません。

伝統的な OOP 派は、すべてのデータを「プライベート」にし、さまざまな関数を介してそれらにアクセスまたは変更して、「カプセル化」と呼ばれるものを強制し、最終的なコールバックまたはイベントをサポートするためにインターフェイスを拡張する必要がある場合に備えて、作業を容易にする傾向があります。

この些細な単純なケースでは、まあ... すべてがエネルギーの浪費のように見えます (そして、適切なコンパイラーの最適化がなければエネルギーの浪費です! 本当の物理的な意味で)。しかし、何か他のものとの統一されたインターフェースが必要だったのかもしれません。

于 2012-11-22T07:32:46.813 に答える
1

プライベートの機能的な動作は他の回答で説明されているため、クラス外のプライベート メンバーに直接アクセスすると、コンパイル エラーが発生します。

セッター関数を使用して一部のメンバーを非公開にする理由を尋ねる場合は、設計の問題です。例えば; 半径を常に正の数にする必要がある場合は、set 関数を次のように記述できます。

void setRadius(double r)
{  
    if(radius >= 0)
        radius = r;
    else
        radius = 0;
}

したがって、メンバーの値がクラス外で変更されようとしたときに、メンバーの値を制御できます。

于 2012-11-22T07:47:25.800 に答える
0

クラスメソッドだけでは誰もプライベート変数にアクセスできず、メイン関数からのみパブリックメソッドにアクセスできるというパブリックプライベートの概念。したがって、関数setRadiusは、半径のプライベート変数を設定する責任があります。

public:
   void setRadius(double r)
   {  radius = r; }  

radiusはプライベート変数であるため、クラス内にパブリック関数を作成してその変数を設定する必要があります。これにより、Circleオブジェクトを作成するときに半径を設定できます。

これは、メインの半径を設定するために機能します

Circle * test = new Circle;
test.setRadius(7);  

しかし、半径を直接設定しようとした場合:

Circle * test = new Circle;
test.radius = 7;

プログラムがクラッシュしますクラスのプライベートメソッドにアクセスできません

于 2012-11-22T07:41:25.187 に答える
0

半径は非公開です。その機能がなければ、クラスの外から半径を設定することはできません。クラスが有用であるためには、Circle 型のオブジェクトを作成し、それらの半径を設定できるようにしたいでしょう。したがって、その半径を設定するには、何らかの関数が必要です。

これを解決する最も簡単で合理的な方法は、クラス Circle 自体の内部に public メンバー関数を提供することです。

これは、あなたが示したようなセッターを使用して最も簡単に行うことができます。これにより、半径を設定し、後で変更することができます。

void SetRadius(float r)
{
    radius = r;
} 

コンストラクターに追加の引数を指定して、Circle の半径が常にユーザー指定の値で初期化されるようにするか、少なくともradius(C++11 の場合) の宣言でデフォルト値を設定することもできます。

于 2012-11-22T07:27:03.677 に答える