2016-06-14 5 views
-4

"BIGRECTANGLE"클래스에서 더 큰 사각형을 만들기 위해 파생 클래스 "RECTANGLE"이 기본 클래스 "SHAPE"안에있는 함수를 사용하려고합니다. 나는 내 측면 변혁을 수업 내에서하고 주에서하지 말고하고 싶습니다. 어떻게해야합니까? 감사! - 45:14 : 중첩 클래스 및 상속

#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; 
} 

은 내가 가지고있는 오류입니다 오류 : 전에 예상 비정규-ID '.' 토큰 - 46:14 : 오류 : '.'앞에 unqualified-id가 있어야합니다. 토큰 - 47 : 5 : 오류 : '영역'의 이름이 유형이 아닙니다.

+1

그 물건을 생성자에 넣거나 뭐든지 ... 생성자가 무엇인지 아십니까? 너는 그들을 사용하지 않고있다. – LogicStuff

+0

@LogicStuff 당신이 알아낼 수 있도록 도와 줄 수 있습니까? – FL93

+0

다음은 생성자에 대한 [tutorial] (http://www.cplusplus.com/doc/tutorial/classes/) 링크입니다. [상속] (https : // www.cs.bu.edu/teaching/cpp/inheritance/intro/). 그들을 읽으십시오. Google은 귀하의 친구입니다. – NonCreature0714

답변

1

모든 것을위한 시간과 장소가 있습니다. 생성자의 Member Initializer List입니다에

class BIGRectangle: public Rectangle 
{ 
public: 

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

최고의 장소에서 클래스 멤버를 초기화합니다. 예를 들어 :

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 

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

이 말한다, 나에게 4 8하고 Rectangle 's이 (가) area을 계산 저장하는 Rectangle 제조 된 BIGRectangle을 구축 할 수 있습니다.

그러나 높이와 너비가 필요한 생성자를 사용하려면 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); 
    } 
}; 

또한이 사용하는 Rectangle를 빌드를 Shapewidth 오히려 자사가 소유하고있는 것 이외의 height. 같은 장소에 두 개의 이름이 주어지면 컴파일러는 가장 안쪽에 선언 된 것을 선택하고 가장 바깥 쪽을 숨기므로 혼동과 사고로 이어집니다. Rectanglewidthheight을보고 Shape에 정의 된 내용을 확인하는 데 도움이 필요합니다. ShapeRectangleShape 후에 정의 되었기 때문에 Rectangle이 존재한다는 단서가 없습니다. 결과적으로 Shapewidthheight 만 볼 수 있습니다.

이렇게하면 getArea으로 전화 할 때 실제 불쾌한 주쥬가됩니다. 현재 버전은 Shapewidthheight으로 설정하고 Rectangle의 및 height을 사용하여 영역을 계산합니다. 네가 원하는 일이 아니야.

그리고 그 매개 변수가 inwidth하지 width 얼마나 폭과 높이

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; 
}; 

주를 사용하는 생성자를 가지고 모양을 필요로한다. 이것은 꼭 필요한 것은 아니지만 위와 같은 이유 때문에 같은 장소 또는 가까운 곳에 같은 이름을 두 번 사용하는 것은 나쁜 형태입니다. 동시에 같은 장소에서 같은 이름이 잘못되었습니다.

그러나 CircleShape 일 때 어떤 일이 발생하는지 묻습니다. 서클에는 너비 또는 높이가 없기 때문에 Shape을 다시 생각해 볼 수 있습니다.

+0

이것은 완벽한 감사입니다! – FL93

+0

완벽하지 않습니다. 직사각형이 아닌 모양을 만듦과 동시에 계층 구조가 무너집니다. 객체 계층에서 루트로 돌아가는 모든 레이어는 추상적이어야하므로 이전보다 작아야합니다. Shape는 Rectangle만큼이나 알고 있으므로 Shape이 원, 삼각형 또는 직사각형이 아닌 다른 요소를 나타내는 것을 방지합니다. 모양은 정말로, 정말로, 정말로 * 멍청해야합니다. 그것은 아무 것도 모른다. – user4581301