2016-03-24 24 views
1

私はOOPを初めて使っているので、継承を実装するプログラムを作成しようとしていました。ここでは、派生クラスの幅と高さの値を受け入れています。スーパークラス、すなわちRectangleに同じ値を反映する方法はありますか?つまりRectangleAreaのInput()に幅と高さとして3と4を入力すると、RectangleクラスのDisplay()に同じ値が表示されます。スーパークラスの変数をC++のサブクラスから変更する方法は?

#include <iostream> 

    using namespace std; 

    class Rectangle 
    { 
    public: 
     int width; 
     int height; 
    public: 
     void Display() 
     { 
      cout<<"Height"<<height<<",Width"<<width<<endl; 
     } 
    }; 

    class RectangleArea : public Rectangle 
    { 
    public: 
     void Input() 
     { 
      cin>>width; 
      cout<<" "; 
      cin>>height; 
     } 
     void Display(int area) 
     { 
      cout<<"Area"<<area; 
     } 
    }; 

    int main() 
    { 
     Rectangle rect; 
     RectangleArea rect1; 
     rect1.Input(); 
     rect.Display(); 
     return 0; 
    } 
+2

私は非常帳リストから入門C++本を拾ってお勧めします:あなたが理解していることを確認しますhttp://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

+1

C++のクラスとオブジェクト(クラスのインスタンス)の違い。 – TerraPass

+0

C++では、スーパークラスは基本クラスと呼ばれ、サブクラスは派生クラスです。 – alain

答えて

2

すでにRectangleクラスの変数を変更しています。しかし、Rectangleから派生したもの(rect)とRectangleAreaからのもの(rect1)の2つのインスタンスがあるので、rect.DisplayInputメソッドが呼び出されていません。

1

スーパークラスの同じ値を「反映」する必要はありません。heightとはサブクラスではなくスーパークラスのメンバーです。あなたがしたいことは、あなたのサブクラスからDisplay関数を取り除き、スーパークラスが印刷を処理するようにすることだと思います。

#include <iostream> 

using namespace std; 

class Rectangle 
{ 
public: 
    int width; 
    int height; 
public: 
    void Display() 
    { 
     cout<<"Height"<<height<<",Width"<<width<<endl; 
    } 
}; 

class RectangleArea : public Rectangle 
{ 
public: 
    void Input() 
    { 
     cin>>width; 
     cout<<" "; 
     cin>>height; 
    } 
}; 

int main() 
{ 
    RectangleArea rect1; 
    rect1.Input(); 
    rect1.Display(); 
    return 0; 
} 
0

あなたが既に持っているよう求めている、と、長方形のスーパークラスの幅と高さを変更しているところ私はかなり理解していない:

だから、あなたは以下のコードをしたいと思います。私はあなたのコードについて変化するであろうと、それはこのようなものになりますので、あなたのスーパークラスにあなたの基本クラスから表示方法を削除することです:

#include <iostream> 

using namespace std; 

class Rectangle 
{ 
public: 
    int width; 
    int height; 
public: 
    void DisplayHeightAndWidth() 
    { 
     cout<<"Height"<<height<<",Width"<<width<<endl; 
    } 
    void DisplayArea() 
    { 
     cout << "Area" << (height*width) << endl; 
    } 
}; 

class RectangleArea : public Rectangle 
{ 
public: 
    void Input() 
    { 
     cin>>width; 
     cout<<" "; 
     cin>>height; 
    } 
    void Display(int area) 
    { 
     cout<<"Area"<<area; 
    } 
}; 

int main() 
{ 
    Rectangle rect; 
    RectangleArea rect1; 
    rect1.Input(); 
    rect.Display(); 
    return 0; 
} 

をしかし、私はそれを持ってしても意味がないだろうと思い、あなたの矩形領域と呼ばれるクラスは、矩形の領域で何もしないので、入力するだけです。

継承を持つことは、何かを継承するたびに、そのクラス内のすべての公開および保護されたエンティティへのアクセス権(所有権の種類)を持つことになります。したがって、任意のRectangleAreaオブジェクトは、Rectangleで実行できる高さまたは幅に何かできるようになります。

+0

'rect.Display()'はコードに未定義の値を表示します。 – fuenfundachtzig

+0

彼は 'rect.Display()'のどの行を使用していますか?私はそれを見ない。編集:申し訳ありませんが、間違いなく間違いを引き起こすあなたの権利を他の人のコードを読む。 – Cmoraski

0

私はあなたが相続の観点から正しいアイデアを持っているとは思っていません。なぜこの質問がちょっと奇妙に感じられるのですか? OOPやクラスを考えるときは、物事を「分類」しようとしています。たとえば、車のクラスを作成することができます。我々が車両について考えるならば、このクラスの物体は速度を持つべきであることを知っています。なぜなら、それらはあなたをある場所から別の場所に運ぶからです。子クラスはオブジェクトの異なるクラスであるが、依然として車両であるオブジェクトである可能性がある。例えば、車は乗り物であり、車輪の数や1ガロンあたりのマイル数などの独自のメンバー変数に加​​えて、速度があります。すべて車に搭載する必要があるプロパティです。

矩形領域が矩形ではないため、OOPでは、設定した方法について考えるのは難しいです。理にかなっているものはクローズドシェイプのクラスであり、クローズド・フィギュアはすべて有限の面積を持つため、そのクラスのメンバーの1人がエリアになる可能性があります。次に、クローズド・フィギュアの子クラスを長方形にすることができます。 Mark Bと同様に、良いC++テキストを選ぶことをおすすめします。

class ClosedFigure { 
    private: 
     unsigned int area; 
    public: 
     void displayArea() { cout << area << endl;}; 
}; 

class Rectangle : public ClosedFigure { 
    private: 
     // already gets area from ClosedFigure 
     unsigned int length; 
     unsigned int width; 
    public: 
     void getDimensions() { 
      cin >> length >> width; 
      area = length * width 
     } 
}; 

ClosedFigure a; 
Rectangle b; 
b.getDimensions(); 
// User inputs say 3 and 4 
b.displayArea(); 
// program outputs 12 
関連する問題