2015-02-04 2 views
0
나는 내가 follwing을 오류를 가지고이 프로그램을 컴파일
#include<iostream> 
#define PI 3.14 
using namespace std; 

    class ellipse 
    { 
      protected: 
      float a,b; 

      public: 
      ellipse(float x, float y) 
       { 
       a=x; 
       b=y; 
       } 

       float area() 
       { 
       return (PI*a*b); 
       } 
    }; 

    class circle : public ellipse 
    { 
    public: 
     circle(float r) 
     { 
      a=r; 
      b=r; 
     } 
    }; 

main() { 
    float x,y,r; 
    cout<<"Enter the two axes of the ellipse (eg. 5 4) : "; 
    cin>>x>>y; 
    cout<<"\nEnter the radius of the circle : "; 
    cin>>r; 
    ellipse obj(x,y); 
    cout<<"\nEllipse Area : "<<obj.area(); 
    circle obj1(r); 
    cout<<"\nCircle Area : "<<obj1.area(); 
} 

: 아래 (시행 착오)와 같이 상속 클래스와 부모의 생성자

friendclass4.cpp: In constructor ‘circle::circle(float)’: 
friendclass4.cpp:24:1: error: no matching function for call to ‘ellipse::ellipse()’ 
friendclass4.cpp:24:1: note: candidates are: 
friendclass4.cpp:10:1: note: ellipse::ellipse(float, float) 
friendclass4.cpp:10:1: note: candidate expects 2 arguments, 0 provided 
friendclass4.cpp:5:7: note: ellipse::ellipse(const ellipse&) 
friendclass4.cpp:5:7: note: candidate expects 1 argument, 0 provided 

내가 타원의 두 번째 생성자를 추가하고 문제를 해결

ellipse() { 

} 

하지만이 오류를 추가하기 전에 오류가 발생한 이유를 모르겠습니다. 아무도 나에게 이것을 설명 할 수 있습니까?

+0

서식을 수정하십시오. – 0x499602D2

+1

원 - 타원 문제에 대해 들어 보셨습니까? http://en.wikipedia.org/wiki/Circle-ellipse_problem –

답변

3

생성자 circle(float)에서 "초기화 목록"에 인수를 제공하지 않았으므로 기본 생성자 ellipse()을 인수없이 호출해야합니다. 이 문제를 해결하려면 다음을 수행 (그리고 ellipse() 기본 생성자를 제거) :

circle(float r) 
    : ellipse(r, r) 
{ 
} 

이 단순히 위임 2 개의 인수를 ellipse 생성자에 ab의 초기화. 더 나은 캡슐화와보다 간결한 코드를 제공합니다.

+0

맞습니다. 부모 클래스의 생성자는 상속되지 않지만 하위 클래스가 인스턴스화 될 때 호출됩니다. – sjsam

+1

생성자가 정확히 상속되지 않는다는 것은 사실입니다. 기본 클래스에서 두 개의 'float'을 사용하는 생성자가 있으면 파생 클래스에 존재한다는 것을 의미하지 않습니다. 그러나 파생 클래스는 public 또는 protected 기본 클래스 생성자를 호출 할 수 있으며 파생 인스턴스가 만들어지면 하나의 기본 클래스 생성자를 호출해야합니다. 기본적으로 인수를 취하지 않는 기본 클래스의 "기본 생성자"를 호출합니다. 그러나 외부 세계에서 사용할 수없는 보호 된 클래스를 포함하여 모든 기본 클래스 생성자를 호출 할 수 있습니다. –

+0

시간과 답변에 감사드립니다. :) – sjsam