2012-12-18 7 views
0

기본 클래스 인 class polygon의 상속 프로그램이며 파생 클래스 호출 사각형을 만들었습니다. 내 폴리곤 기본 클래스에서 나는 생성자와 소멸자와 두 개의 영역과 둘레에 대해 print 함수를 가지고있다. 파생 된 클래스에는 생성자와 소멸자가 있고 영역과 경계에 대해 두 개의 print 함수가 있고 calc areacalc perimeter 함수가 있습니다. 내가 이해할 수없는 것은 지금이 프로그램을 실행할 때 얻는 결과입니다. 원하는 출력은 area = 45 perimeter = 28입니다. rect_1.calcarea()을 사용할 때이 출력을 얻지 만 rect_1.printarea()을 사용하려고합니다.이 프로그램에 대한 결과물을 이해할 수 없습니다.

#include<iostream> 
using namespace std; 

class polygon 
{ 

protected: 
    double area; 
    double perimeter; 
public: 
    polygon(){} 
    virtual ~polygon(){ } 
    virtual double printarea() const { return area ;} 
    virtual double printperimeter() const { return perimeter ;} 
}; 

class rectangle : public polygon 
{ 

public: 
    rectangle(double , double) ; 
    ~rectangle(){ } 
    double calcarea() ; 
    double calcperimeter() ; 
    virtual double printarea() const { return area ;} 
    virtual double printperimeter() const { return perimeter ;} 

private: 
    double length; 
    double width; 
}; 

rectangle::rectangle(double l , double w) 
{ 
    length = l; 
    width = w; 
} 

double rectangle::calcarea() 
{ 
    area = length*width; 
    return area; 
} 

double rectangle::calcperimeter() 
{ 
    perimeter = length + width; 
    perimeter = perimeter * 2; 
    return perimeter; 
} 

void main() 
{ 
    rectangle rect_1 (9.0, 5.0); 

    cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl; 
    cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl; 

    system("pause"); 
} 
+1

출력은 무엇입니까? –

+0

당신은 어떤 결과를 얻습니까? –

+0

Aside : http://www.stroustrup.com/bs_faq2.html#void-main –

답변

2

printarea() 단지 area 멤버 변수의 값을 반환한다. 당신은 a) 아무것도 초기화하지 않고 b) 어디서나 면적을 계산하지 않습니다.

영역이 초기화되지 않았기 때문에 (즉, 값이 주어지기 때문에) 산출물이 컴파일러 옵션에 따라 0 또는 가비지 인 것 같아요.

calcarea()을 사각형 생성자 또는 메인 인스턴스에서 인스턴스화 한 후 printarea()을 호출하면 올바른 값이 반환됩니다. printarea() 안에 calcarea()으로 전화하여 필요할 때 항상 값이 최신인지 확인할 수도 있습니다.

+1

또는 printarea()에서'calcarea()'를 호출하십시오. –

0

아래 해결 방법을 시도해보십시오. 이렇게하면 문제가 해결됩니다. 여기

내가 변경 한 것입니다 :
printarea 또는 Polygonprintperimeter 전화를 원하는 나는, 추상 클래스로 다각형을 만들었습니다. 또한 calcareacalcperimeter을 각각 호출했습니다. printarea/ printperimeter의 몸체에서 동일하게 수행 할 수 있지만 Rectangle입니다. calcareacalcperimeter으로 전화 할 필요가 없습니다.

#include<iostream> 

using namespace std; 

class polygon 
{ 

protected: 
    double area; 
    double perimeter; 
public: 
    polygon(){} 
    virtual ~polygon(){ } 
    virtual double printarea() = 0; 
    virtual double printperimeter() = 0; 
}; 

class rectangle : public polygon 
{ 

public: 
    rectangle(double , double) ; 
    ~rectangle(){ } 
    double calcarea() ; 
    double calcperimeter() ; 
    double printarea() { return calcarea();} 
    double printperimeter() { return calcperimeter() ;} 

private: 
    double length; 
    double width; 
}; 

rectangle::rectangle(double l , double w) 
{ 
    length = l; 
    width = w; 
} 

double rectangle::calcarea() 
{ 
    area = length*width; 
    return area; 
} 

double rectangle::calcperimeter() 
{ 
    perimeter = length + width; 
    perimeter = perimeter * 2; 
    return perimeter; 
} 

void main() 
{ 
    rectangle rect_1 (9.0, 5.0); 

    cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl; 
    cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl; 

    system("pause"); 
} 
+0

무엇이 변경 되었습니까? 문제는 무엇 이었습니까? – jogojapan

+0

나는 추상 클래스로 다각형을 만들었다. 그는 printarea 또는 printperimeter of polygon 만 호출하기를 원합니다. Furhter 나는 calcarea와 calcperimeter를 각각 불렀습니다. Rectangle의 printarea/printperimeter 본문에서도 동일하게 수행 할 수 있습니다. Calcarea 및 Calcperimeter를 호출 할 필요가 없습니다. – Nipun