2016-06-14 47 views
-4

私は私のクラスに大きな四角形を作成するために、派生クラス「RECTANGLE」と私は、基本クラスの内部で持っている機能「SHAPE」を使用しようとしている「BIGRECTANGLE」。私はクラスの中で私の側の変換をしたいと主なものではない、私は何をすべきですか?ありがとう!ネストされたクラスと継承

#include <iostream> 

using namespace std; 

// Base class Shape 
class Shape 
{ 
public: 

    void ResizeW(int w) 
    { 
     width = w; 
    } 
    void ResizeH(int h) 
    { 
     height = h; 
    } 
protected: 

    int width; 
    int height; 
}; 

// Primitive Shape 

class Rectangle: public Shape 
{ 
public: 

    int width = 2; 
    int height = 1; 
    int getArea() 
    { 
     return (width * height); 
    } 
}; 

// Derived class 

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 
    Rectangle.ResizeW(8); 
    Rectangle.ResizeH(4); 
    area = Rectangle.getArea(); 
}; 

int main(void) 
{ 
    return 0; 
} 

はこれらは私が持っているエラーです: - 45:14:エラー:予想される修飾されていない-IDの前に ''トークン - 46:14:エラー: '。'の前にunqualified-idが必要ですトークン - 47:5:エラー:「面積」はタイプ

+1

コンストラクタなどに入れてください...コンストラクタは何ですか?あなたはそれらを使用していません。 – LogicStuff

+0

@LogicStuffあなたは私に理解を助けることができますか? – FL93

+0

コンストラクタに関する[チュートリアル](http://www.cplusplus.com/doc/tutorial/classes/)へのリンクです。また、[継承](https:// www。cs.bu.edu/teaching/cpp/inheritance/intro/)。それらを読みます; Googleはあなたの友人です。 – NonCreature0714

答えて

1

時間とすべてのための場所があるに名前を付けていません。

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 
    Rectangle.ResizeW(8); 
    Rectangle.ResizeH(4); 
    area = Rectangle.getArea(); 
}; 

のクラスメンバーを初期化するのに最適な場所は、コンストラクタのMember Initializer Listです。たとえば:

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 

    BIGRectangle():Rectangle(8, 4), area(getArea()) 
    { 
    } 
}; 

これは言う、私に4×8であるとRectangle年代はareaを計算し格納Rectangleで作られBIGRectangleを構築します。

しかし、それは高さと幅を必要とするコンストラクタを持っているRectangleが必要です。加えてではなく、独自のよりShapewidthheightを使用していますRectangleを構築すること

class Rectangle: public Shape 
{ 
public: 

    // no need for these because they hide the width and height of Shape 
    // int width = 2; 
    // int height = 1; 
    Rectangle(int width, int height): Shape(width, height) 
    { 

    } 
    int getArea() 
    { 
     return (width * height); 
    } 
}; 

。同じ場所に2つの名前が与えられると、コンパイラは最も内側に宣言されたものを選択し、最も外側に隠すことになり、混乱と事故につながります。 Rectanglewidthheightと表示されており、Shapeで定義されたものを見るのに役立つ必要があります。 Shapeは、RectangleShapeの後に定義されているので、Rectangleが存在するという手がかりもありません。その結果、Shapewidthheightとしか表示されません。

あなたがgetAreaを呼び出すとき、これはいくつかの本当の厄介なジュジュにつながります。現在のバージョンはShapewidthheightRectangle使用しています "設定のwidthheightは面積を計算します。あなたは何をしたいのではありません。

そして、それは、幅と高さ

class Shape 
{ 
public: 
    Shape(int inwidth, 
      int inheight): width(inwidth), height(inheight) 
    { 

    } 
    void ResizeW(int w) 
    { 
     width = w; 
    } 
    void ResizeH(int h) 
    { 
     height = h; 
    } 
protected: 

    int width; 
    int height; 
}; 

パラメータはinwidth、ないwidthでどのようにノートを取るコンストラクタを持つように形状を必要とします。これは厳密には必要ではありませんが、上記と同じ理由で同じ場所または近い場所で同じ名前を2回使用することは悪い形式です。同時に同じ場所にある同じ名前が悪いです。

しかし、これはあなたがShapeあるCircleを持っているときに何が起こるかの質問をします。サークルには幅や高さがないため、Shapeを再考する必要があります。

+0

これは完璧です! – FL93

+0

完璧ではありません。非長方形の形状を持つとすぐに階層が下がります。オブジェクト階層のルートに戻るすべての層は、より抽象的でなければならないため、前の層よりも知っていなければなりません。 ShapeはRectangleと同じくらい知っているので、Shapeが円、三角形など矩形でないものを表すことはできません。形は本当に、本当に、本当に*本当にダムでなければなりません。それは何も知らないはずです。 – user4581301

関連する問題